12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422 |
- {
- Copyright (C) <avx-testfile-generator> <Torsten Grundke>
- This source is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2 of the License, or (at your option)
- any later version.
- This code is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- details.
- A copy of the GNU General Public License is available on the World Wide Web
- at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
- to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- MA 02110-1301, USA.
- }
- {$mode objfpc}
- unit asmtestgenerator;
- interface
- uses BaseList, Classes;
- type
- TOpType = (otUnknown, otXMMReg, otXMMRM, otXMMRM16, otXMMRM8, otYMMReg, otYMMRM, otZMMReg, otZMMRM, otEAX, otRAX, otMem32,
- otMem8, otMem16, otMem64, otMem128, otMem256, otMem512, otREG64, otREG32, otREG16, otREG8, otRM32, otRM64, otIMM8,
- otXMEM32, otXMEM64, otYMEM32, otYMEM64, otZMEM32, otZMEM64,
- otB32, otB64, otKREG);
- TOpMemType = Set of TOpType;
- TAsmCompareMode = (cmKORTESTNC, cmXORTestNZ);
- TOpMode = (omUnknown,
- omMX, omMY, omMZ,
- omXB32, omXB64, omYB32, omYB64, omZB32, omZB64,
- omXM, omYM, omZM,
- omKXM, omKYM, omKZM,
- omKXB32, omKXB64, omKYB32, omKYB64, omKZB32, omKZB64,
- omKXB32I, omKXB64I, omKXMI, omKYB32I, omKYB64I, omKYMI, omKZB32I, omKZB64I, omKZMI,
- omKMI, omKB32I, omKB64I,
- omMXI, omMYI, omMZI,
- omXXM, omXXB32, omXXB64, omXMI, omXB32I, omXB64I,
- omXXMI, omXXB32I, omXXB64I,
- omYYM, omYYB32, omYYB64, omYMI, omYB32I, omYB64I,
- omYYMI, omYYB32I, omYYB64I,
- omZZM, omZZB32, omZZB64, omZMI, omZB32I, omZB64I,
- omZZMI, omZZB32I, omZZB64I);
- TOperandListItem = class(TObject)
- private
- FOpActive: boolean;
- FOpNumber: integer;
- FOpTyp: TOpType;
- FValues: TStringList;
- public
- constructor Create;
- destructor Destroy; override;
- property OpNumber: integer read FOpNumber write FOpNumber;
- property OpTyp: TOpType read FOpTyp write FOpTyp;
- property OpActive: boolean read FOpActive write FOpActive;
- property Values: TStringList read FValues;
- end;
- TOperandList = class(TBaseList)
- private
- function GetItems(aIndex: integer): TOperandListItem;
- public
- function Add(aItem: TOperandListItem): integer;
- property Items[aIndex: integer]: TOperandListItem read GetItems;
- end;
- { TAsmTestGenerator }
- TAsmTestGenerator = class(TObject)
- private
- FReg8 : TStringList;
- FReg16 : TStringList;
- FReg32Base : TStringList;
- FReg32Index : TStringList;
- FReg64Base : TStringList;
- FReg64Index : TStringList;
- FReg6432Base : TStringList;
- FReg6432Index : TStringList;
- FReg32XMMIndex : TStringList;
- FReg32YMMIndex : TStringList;
- FReg32ZMMIndex : TStringList;
- FReg64XMMIndex : TStringList;
- FReg64YMMIndex : TStringList;
- FReg64ZMMIndex : TStringList;
- FRegKREG : TStringList;
- Fx64: boolean;
- FAVX512: boolean;
- FSAE: boolean;
- procedure MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
- procedure MemRegBaseIndexCombiCDISP8N(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
- procedure VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
- function ParseBaseIndexReg(const aOp: string; var aBaseReg, aIndexReg: string): boolean;
- function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
- function InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
- function InternalCalcTestDataCDISP8(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
- public
- constructor Create;
- destructor Destroy; override;
- class procedure CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
- class procedure CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
- class procedure CalcTestDataCDisp8(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
- class procedure CalcTestInstFile;
- class procedure ListMemRefState;
- property x64: boolean read Fx64;
- end;
- implementation
- uses SysUtils, Dialogs, typinfo;
- type
- TAsmOp={$i ../../../compiler/x86_64/x8664op.inc}
- TAttSuffix = (AttSufNONE,AttSufINT,AttSufFPU,AttSufFPUint,AttSufINTdual,AttSufMM,AttSufMMX,AttSufMMS);
- TMemRefSizeInfo = (msiUnknown, msiUnsupported, msiNoSize, msiNoMemRef,
- msiMultiple, msiMultipleMinSize8, msiMultipleMinSize16, msiMultipleMinSize32,
- msiMultipleMinSize64, msiMultipleMinSize128, msiMultipleminSize256, msiMultipleMinSize512,
- msiMemRegSize, msiMemRegx16y32, msiMemRegx16y32z64, msiMemRegx32y64, msiMemRegx32y64z128, msiMemRegx64y128, msiMemRegx64y128z256,
- msiMemRegx64y256, msiMemRegx64y256z512,
- msiMem8, msiMem16, msiMem32, msiBMem32, msiMem64, msiBMem64, msiMem128, msiMem256, msiMem512,
- msiXMem32, msiXMem64, msiYMem32, msiYMem64, msiZMem32, msiZMem64,
- msiVMemMultiple, msiVMemRegSize,
- msiMemRegConst128,msiMemRegConst256,msiMemRegConst512);
- TMemRefSizeInfoBCST = (msbUnknown, msbBCST32, msbBCST64, msbMultiple);
- TMemRefSizeInfoBCSTType = (btUnknown, bt1to2, bt1to4, bt1to8, bt1to16);
- TEVEXTupleState = (etsUnknown, etsIsTuple, etsNotTuple);
- TConstSizeInfo = (csiUnknown, csiMultiple, csiNoSize, csiMem8, csiMem16, csiMem32, csiMem64);
- TInsTabMemRefSizeInfoRec = record
- MemRefSize : TMemRefSizeInfo;
- MemRefSizeBCST : TMemRefSizeInfoBCST;
- BCSTXMMMultiplicator : byte;
- ExistsSSEAVX : boolean;
- ConstSize : TConstSizeInfo;
- BCSTTypes : Set of TMemRefSizeInfoBCSTType;
- RegXMMSizeMask : int64;
- RegYMMSizeMask : int64;
- RegZMMSizeMask : int64;
- end;
- TInsTabMemRefSizeInfoCache=array[TasmOp] of TInsTabMemRefSizeInfoRec;
- PInsTabMemRefSizeInfoCache=^TInsTabMemRefSizeInfoCache;
- TInsTabCache=array[TasmOp] of longint;
- PInsTabCache=^TInsTabCache;
- const
- instabentries = {$i ../../../compiler/x86_64/x8664nop.inc}
- gas_needsuffix:array[tasmop] of TAttSuffix={$i ../../../compiler/x86_64/x8664ats.inc}
- MemRefMultiples: set of TMemRefSizeInfo = [msiMultiple, msiMultipleMinSize8,
- msiMultipleMinSize16, msiMultipleMinSize32,
- msiMultipleMinSize64, msiMultipleMinSize128,
- msiMultipleMinSize256, msiMultipleMinSize512,
- msiVMemMultiple];
- MemRefSizeInfoVMems: Set of TMemRefSizeInfo = [msiXMem32, msiXMem64, msiYMem32, msiYMem64,
- msiZMem32, msiZMem64,
- msiVMemMultiple, msiVMemRegSize];
- MEMTYPES: TOpMemType = [otXMMRM, otXMMRM16, otXMMRM8, otYMMRM, otZMMRM,
- otMem8, otMem16, otMem32, otMem64, otMem128, otMem256, otMem512,
- otRM32, otRM64];
- BMEMTYPES: TOpMemType = [otB32, otB64];
- var
- InsTabCache : PInsTabCache;
- InsTabMemRefSizeInfoCache: PInsTabMemRefSizeInfoCache;
- type
- op2strtable=array[tasmop] of string[16];
- {Instruction flags }
- tinsflag = (
- { please keep these in order and in sync with IF_SMASK }
- IF_SM, { size match first two operands }
- IF_SM2,
- IF_SB, { unsized operands can't be non-byte }
- IF_SW, { unsized operands can't be non-word }
- IF_SD, { unsized operands can't be nondword }
- { unsized argument spec }
- { please keep these in order and in sync with IF_ARMASK }
- IF_AR0, { SB, SW, SD applies to argument 0 }
- IF_AR1, { SB, SW, SD applies to argument 1 }
- IF_AR2, { SB, SW, SD applies to argument 2 }
- IF_PRIV, { it's a privileged instruction }
- IF_SMM, { it's only valid in SMM }
- IF_PROT, { it's protected mode only }
- IF_NOX86_64, { removed instruction in x86_64 }
- IF_UNDOC, { it's an undocumented instruction }
- IF_FPU, { it's an FPU instruction }
- IF_MMX, { it's an MMX instruction }
- { it's a 3DNow! instruction }
- IF_3DNOW,
- { it's a SSE (KNI, MMX2) instruction }
- IF_SSE,
- { SSE2 instructions }
- IF_SSE2,
- { SSE3 instructions }
- IF_SSE3,
- { SSE64 instructions }
- IF_SSE64,
- { SVM instructions }
- IF_SVM,
- { SSE4 instructions }
- IF_SSE4,
- IF_SSSE3,
- IF_SSE41,
- IF_SSE42,
- IF_MOVBE,
- IF_CLMUL,
- IF_AVX,
- IF_AVX2,
- IF_AVX512,
- IF_BMI1,
- IF_BMI2,
- { Intel ADX (Multi-Precision Add-Carry Instruction Extensions) }
- IF_ADX,
- IF_16BITONLY,
- IF_FMA,
- IF_FMA4,
- IF_TSX,
- IF_RAND,
- IF_XSAVE,
- IF_PREFETCHWT1,
- { mask for processor level }
- { please keep these in order and in sync with IF_PLEVEL }
- IF_8086, { 8086 instruction }
- IF_186, { 186+ instruction }
- IF_286, { 286+ instruction }
- IF_386, { 386+ instruction }
- IF_486, { 486+ instruction }
- IF_PENT, { Pentium instruction }
- IF_P6, { P6 instruction }
- IF_KATMAI, { Katmai instructions }
- IF_WILLAMETTE, { Willamette instructions }
- IF_PRESCOTT, { Prescott instructions }
- IF_X86_64,
- IF_SANDYBRIDGE, { Sandybridge-specific instruction }
- IF_NEC, { NEC V20/V30 instruction }
- { the following are not strictly part of the processor level, because
- they are never used standalone, but always in combination with a
- separate processor level flag. Therefore, they use bits outside of
- IF_PLEVEL, otherwise they would mess up the processor level they're
- used in combination with.
- The following combinations are currently used:
- [IF_AMD, IF_P6],
- [IF_CYRIX, IF_486],
- [IF_CYRIX, IF_PENT],
- [IF_CYRIX, IF_P6] }
- IF_CYRIX, { Cyrix, Centaur or VIA-specific instruction }
- IF_AMD, { AMD-specific instruction }
- { added flags }
- IF_PRE, { it's a prefix instruction }
- IF_PASS2, { if the instruction can change in a second pass }
- IF_IMM4, { immediate operand is a nibble (must be in range [0..15]) }
- IF_IMM3, { immediate operand is a triad (must be in range [0..7]) }
- IF_BCST2,
- IF_BCST4,
- IF_BCST8,
- IF_BCST16,
- IF_T2, { disp8 - tuple - 2 }
- IF_T4, { disp8 - tuple - 4 }
- IF_T8, { disp8 - tuple - 8 }
- IF_T1S, { disp8 - tuple - 1 scalar }
- IF_T1S8,
- IF_T1S16,
- IF_T1F32,
- IF_T1F64,
- IF_TMDDUP,
- IF_TFV, { disp8 - tuple - full vector }
- IF_TFVM, { disp8 - tuple - full vector memory }
- IF_TQVM,
- IF_TMEM128,
- IF_THV,
- IF_THVM,
- IF_TOVM,
- IF_SCL32,
- IF_SCL64
- );
- tinsflags=set of tinsflag;
- tinsentry=packed record
- opcode : tasmop;
- ops : byte;
- //optypes : array[0..max_operands-1] of longint;
- optypes : array[0..3] of int64; //TG
- code : array[0..11] of char;
- flags : tinsflags;
- end;
- pinsentry=^tinsentry;
- const
- OT_NONE = $00000000;
- { Bits 0..7: sizes }
- OT_BITS8 = $00000001;
- OT_BITS16 = $00000002;
- OT_BITS32 = $00000004;
- OT_BITS64 = $00000008; { x86_64 and FPU }
- //OT_BITS128 = $10000000; { 16 byte SSE }
- //OT_BITS256 = $20000000; { 32 byte AVX }
- //OT_BITS512 = $40000000; { 64 byte AVX512 }
- OT_BITS128 = $20000000; { 16 byte SSE }
- OT_BITS256 = $40000000; { 32 byte AVX }
- OT_BITS512 = $80000000; { 64 byte AVX512 }
- OT_VECTORMASK = $1000000000; { OPTIONAL VECTORMASK AVX512}
- OT_VECTORZERO = $2000000000; { OPTIONAL ZERO-FLAG AVX512}
- OT_VECTORBCST = $4000000000; { BROADCAST-MEM-FLAG AVX512}
- OT_VECTORSAE = $8000000000; { OPTIONAL SAE-FLAG AVX512}
- OT_VECTORER = $10000000000; { OPTIONAL ER-FLAG-FLAG AVX512}
- OT_BITSB32 = OT_BITS32 or OT_VECTORBCST;
- OT_BITSB64 = OT_BITS64 or OT_VECTORBCST;
- OT_VECTOR_EXT_MASK = OT_VECTORMASK or OT_VECTORZERO or OT_VECTORBCST;
- OT_BITS80 = $00000010; { FPU only }
- OT_FAR = $00000020; { this means 16:16 or 16:32, like in CALL/JMP }
- OT_NEAR = $00000040;
- OT_SHORT = $00000080;
- { TODO: FAR/NEAR/SHORT are sizes too, they should be included into size mask,
- but this requires adjusting the opcode table }
- //OT_SIZE_MASK = $3000001F; { all the size attributes }
- OT_SIZE_MASK = $E000001F; { all the size attributes }
- OT_NON_SIZE = int64(not int64(OT_SIZE_MASK));
- { Bits 8..11: modifiers }
- OT_SIGNED = $00000100; { the operand need to be signed -128-127 }
- OT_TO = $00000200; { reverse effect in FADD, FSUB &c }
- OT_COLON = $00000400; { operand is followed by a colon }
- OT_MODIFIER_MASK = $00000F00;
- { Bits 12..15: type of operand }
- OT_REGISTER = $00001000;
- OT_IMMEDIATE = $00002000;
- OT_MEMORY = $0000C000; { always includes 'OT_REGMEM' bit as well }
- OT_REGMEM = $00008000; { for r/m, ie EA, operands }
- OT_TYPE_MASK = OT_REGISTER or OT_IMMEDIATE or OT_MEMORY or OT_REGMEM;
- OT_REGNORM = OT_REGISTER or OT_REGMEM; { 'normal' reg, qualifies as EA }
- { Bits 20..22, 24..26: register classes
- otf_* consts are not used alone, only to build other constants. }
- otf_reg_cdt = $00100000;
- otf_reg_gpr = $00200000;
- otf_reg_sreg = $00400000;
- otf_reg_k = $00800000;
- otf_reg_fpu = $01000000;
- otf_reg_mmx = $02000000;
- otf_reg_xmm = $04000000;
- otf_reg_ymm = $08000000;
- otf_reg_zmm = $10000000;
- otf_reg_extra_mask = $0F000000;
- { Bits 16..19: subclasses, meaning depends on classes field }
- otf_sub0 = $00010000;
- otf_sub1 = $00020000;
- otf_sub2 = $00040000;
- otf_sub3 = $00080000;
- OT_REG_SMASK = otf_sub0 or otf_sub1 or otf_sub2 or otf_sub3;
- //OT_REG_EXTRA_MASK = $0F000000;
- OT_REG_EXTRA_MASK = $1F000000;
- OT_REG_TYPMASK = otf_reg_cdt or otf_reg_gpr or otf_reg_sreg or otf_reg_k or otf_reg_extra_mask;
- { register class 0: CRx, DRx and TRx }
- OT_REG_CDT = OT_REGISTER or otf_reg_cdt or OT_BITS64;
- OT_REG_CREG = OT_REG_CDT or otf_sub0; { CRn }
- OT_REG_DREG = OT_REG_CDT or otf_sub1; { DRn }
- OT_REG_TREG = OT_REG_CDT or otf_sub2; { TRn }
- OT_REG_CR4 = OT_REG_CDT or otf_sub3; { CR4 (Pentium only) }
- { register class 1: general-purpose registers }
- OT_REG_GPR = OT_REGNORM or otf_reg_gpr;
- OT_RM_GPR = OT_REGMEM or otf_reg_gpr;
- OT_REG8 = OT_REG_GPR or OT_BITS8; { 8-bit GPR }
- OT_REG16 = OT_REG_GPR or OT_BITS16;
- OT_REG32 = OT_REG_GPR or OT_BITS32;
- OT_REG64 = OT_REG_GPR or OT_BITS64;
- { GPR subclass 0: accumulator: AL, AX, EAX or RAX }
- OT_REG_ACCUM = OT_REG_GPR or otf_sub0;
- OT_REG_AL = OT_REG_ACCUM or OT_BITS8;
- OT_REG_AX = OT_REG_ACCUM or OT_BITS16;
- OT_REG_EAX = OT_REG_ACCUM or OT_BITS32;
- OT_REG_RAX = OT_REG_ACCUM or OT_BITS64;
- { GPR subclass 1: counter: CL, CX, ECX or RCX }
- OT_REG_COUNT = OT_REG_GPR or otf_sub1;
- OT_REG_CL = OT_REG_COUNT or OT_BITS8;
- OT_REG_CX = OT_REG_COUNT or OT_BITS16;
- OT_REG_ECX = OT_REG_COUNT or OT_BITS32;
- OT_REG_RCX = OT_REG_COUNT or OT_BITS64;
- { GPR subclass 2: data register: DL, DX, EDX or RDX }
- OT_REG_DX = OT_REG_GPR or otf_sub2 or OT_BITS16;
- OT_REG_EDX = OT_REG_GPR or otf_sub2 or OT_BITS32;
- { register class 2: Segment registers }
- OT_REG_SREG = OT_REGISTER or otf_reg_sreg or OT_BITS16;
- OT_REG_CS = OT_REG_SREG or otf_sub0; { CS }
- OT_REG_DESS = OT_REG_SREG or otf_sub1; { DS, ES, SS (non-CS 86 registers) }
- OT_REG_FSGS = OT_REG_SREG or otf_sub2; { FS, GS (386 extended registers) }
- { register class 3: FPU registers }
- OT_FPUREG = OT_REGISTER or otf_reg_fpu;
- OT_FPU0 = OT_FPUREG or otf_sub0; { FPU stack register zero }
- { register class 4: MMX (both reg and r/m) }
- OT_MMXREG = OT_REGNORM or otf_reg_mmx;
- OT_MMXRM = OT_REGMEM or otf_reg_mmx;
- { register class 5: XMM (both reg and r/m) }
- OT_XMMREG = OT_REGNORM or otf_reg_xmm;
- OT_XMMRM = OT_REGMEM or otf_reg_xmm;
- OT_XMEM32 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS32;
- OT_XMEM32_M = OT_XMEM32 or OT_VECTORMASK;
- OT_XMEM64 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS64;
- OT_XMEM64_M = OT_XMEM64 or OT_VECTORMASK;
- OT_XMMREG_M = OT_XMMREG or OT_VECTORMASK;
- OT_XMMREG_MZ = OT_XMMREG or OT_VECTORMASK or OT_VECTORZERO;
- OT_XMMRM_MZ = OT_XMMRM or OT_VECTORMASK or OT_VECTORZERO;
- OT_XMMREG_SAE = OT_XMMREG or OT_VECTORSAE;
- OT_XMMRM_SAE = OT_XMMRM or OT_VECTORSAE;
- OT_XMMREG_ER = OT_XMMREG or OT_VECTORER;
- OT_XMMRM_ER = OT_XMMRM or OT_VECTORER;
- { register class 5: YMM (both reg and r/m) }
- OT_YMMREG = OT_REGNORM or otf_reg_ymm;
- OT_YMMRM = OT_REGMEM or otf_reg_ymm;
- OT_YMEM32 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS32;
- OT_YMEM32_M = OT_YMEM32 or OT_VECTORMASK;
- OT_YMEM64 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS64;
- OT_YMEM64_M = OT_YMEM64 or OT_VECTORMASK;
- OT_YMMREG_M = OT_YMMREG or OT_VECTORMASK;
- OT_YMMREG_MZ = OT_YMMREG or OT_VECTORMASK or OT_VECTORZERO;
- OT_YMMRM_MZ = OT_YMMRM or OT_VECTORMASK or OT_VECTORZERO;
- OT_YMMREG_SAE = OT_YMMREG or OT_VECTORSAE;
- OT_YMMRM_SAE = OT_YMMRM or OT_VECTORSAE;
- OT_YMMREG_ER = OT_YMMREG or OT_VECTORER;
- OT_YMMRM_ER = OT_YMMRM or OT_VECTORER;
- { register class 5: ZMM (both reg and r/m) }
- OT_ZMMREG = OT_REGNORM or otf_reg_zmm;
- OT_ZMMRM = OT_REGMEM or otf_reg_zmm;
- OT_ZMEM32 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS32;
- OT_ZMEM32_M = OT_ZMEM32 or OT_VECTORMASK;
- OT_ZMEM64 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS64;
- OT_ZMEM64_M = OT_ZMEM64 or OT_VECTORMASK;
- OT_ZMMREG_M = OT_ZMMREG or OT_VECTORMASK;
- OT_ZMMREG_MZ = OT_ZMMREG or OT_VECTORMASK or OT_VECTORZERO;
- OT_ZMMRM_MZ = OT_ZMMRM or OT_VECTORMASK or OT_VECTORZERO;
- OT_ZMMREG_SAE = OT_ZMMREG or OT_VECTORSAE;
- OT_ZMMRM_SAE = OT_ZMMRM or OT_VECTORSAE;
- OT_ZMMREG_ER = OT_ZMMREG or OT_VECTORER;
- OT_ZMMRM_ER = OT_ZMMRM or OT_VECTORER;
- OT_KREG = OT_REGNORM or otf_reg_k;
- OT_KREG_M = OT_KREG or OT_VECTORMASK;
- { Vector-Memory operands }
- OT_VMEM_ANY = OT_XMEM32 or OT_XMEM64 or OT_YMEM32 or OT_YMEM64 or OT_ZMEM32 or OT_ZMEM64;
- { Memory operands }
- OT_MEM8 = OT_MEMORY or OT_BITS8;
- OT_MEM16 = OT_MEMORY or OT_BITS16;
- OT_MEM16_M = OT_MEM16 or OT_VECTORMASK;
- OT_MEM32 = OT_MEMORY or OT_BITS32;
- OT_MEM32_M = OT_MEMORY or OT_BITS32 or OT_VECTORMASK;
- OT_BMEM32 = OT_MEMORY or OT_BITS32 or OT_VECTORBCST;
- OT_BMEM32_SAE= OT_MEMORY or OT_BITS32 or OT_VECTORBCST or OT_VECTORSAE;
- OT_MEM64 = OT_MEMORY or OT_BITS64;
- OT_MEM64_M = OT_MEMORY or OT_BITS64 or OT_VECTORMASK;
- OT_BMEM64 = OT_MEMORY or OT_BITS64 or OT_VECTORBCST;
- OT_BMEM64_SAE= OT_MEMORY or OT_BITS64 or OT_VECTORBCST or OT_VECTORSAE;
- OT_MEM128 = OT_MEMORY or OT_BITS128;
- OT_MEM128_M = OT_MEMORY or OT_BITS128 or OT_VECTORMASK;
- OT_MEM256 = OT_MEMORY or OT_BITS256;
- OT_MEM256_M = OT_MEMORY or OT_BITS256 or OT_VECTORMASK;
- OT_MEM512 = OT_MEMORY or OT_BITS512;
- OT_MEM512_M = OT_MEMORY or OT_BITS512 or OT_VECTORMASK;
- OT_MEM80 = OT_MEMORY or OT_BITS80;
- OT_MEM_OFFS = OT_MEMORY or otf_sub0; { special type of EA }
- { simple [address] offset }
- { Matches any type of r/m operand }
- 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;
- { Immediate operands }
- OT_IMM8 = OT_IMMEDIATE or OT_BITS8;
- OT_IMM16 = OT_IMMEDIATE or OT_BITS16;
- OT_IMM32 = OT_IMMEDIATE or OT_BITS32;
- OT_IMM64 = OT_IMMEDIATE or OT_BITS64;
- OT_ONENESS = otf_sub0; { special type of immediate operand }
- OT_UNITY = OT_IMMEDIATE or OT_ONENESS; { for shift/rotate instructions }
- std_op2str:op2strtable={$i ../../../compiler/x86_64/x8664int.inc}
- InsTab:array[0..instabentries-1] of TInsEntry={$i ../../../compiler/x86_64/x8664tab.inc}
- procedure BuildInsTabCache;
- var
- i : longint;
- begin
- new(instabcache);
- FillChar(instabcache^,sizeof(tinstabcache),$ff);
- i:=0;
- while (i<InsTabEntries) do
- begin
- if InsTabCache^[InsTab[i].OPcode]=-1 then
- InsTabCache^[InsTab[i].OPcode]:=i;
- inc(i);
- end;
- end;
- procedure BuildInsTabMemRefSizeInfoCache;
- var
- AsmOp: TasmOp;
- i,j: longint;
- insentry : PInsEntry;
- MRefInfo: TMemRefSizeInfo;
- SConstInfo: TConstSizeInfo;
- actRegSize: int64;
- actMemSize: int64;
- actConstSize: int64;
- actRegCount: integer;
- actMemCount: integer;
- actConstCount: integer;
- actRegTypes : int64;
- actRegMemTypes: int64;
- NewRegSize: int64;
- actVMemCount : integer;
- actVMemTypes : int64;
- RegMMXSizeMask: int64;
- RegXMMSizeMask: int64;
- RegYMMSizeMask: int64;
- RegZMMSizeMask: int64;
- RegMMXConstSizeMask: int64;
- RegXMMConstSizeMask: int64;
- RegYMMConstSizeMask: int64;
- RegZMMConstSizeMask: int64;
- RegBCSTSizeMask: int64;
- RegBCSTXMMSizeMask: int64;
- RegBCSTYMMSizeMask: int64;
- RegBCSTZMMSizeMask: int64;
- ExistsMemRef : boolean;
- bitcount : integer;
- ExistsCode336 : boolean;
- ExistsCode337 : boolean;
- ExistsSSEAVXReg : boolean;
- function bitcnt(aValue: int64): integer;
- var
- i: integer;
- begin
- result := 0;
- for i := 0 to 63 do
- begin
- if (aValue mod 2) = 1 then
- begin
- inc(result);
- end;
- aValue := aValue shr 1;
- end;
- end;
- begin
- new(InsTabMemRefSizeInfoCache);
- FillChar(InsTabMemRefSizeInfoCache^,sizeof(TInsTabMemRefSizeInfoCache),0);
- for AsmOp := low(TAsmOp) to high(TAsmOp) do
- begin
- i := InsTabCache^[AsmOp];
- if i >= 0 then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiUnknown;
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbUnknown;
- InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 0;
- InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiUnknown;
- InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := false;
- InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := [];
- insentry:=@instab[i];
- RegMMXSizeMask := 0;
- RegXMMSizeMask := 0;
- RegYMMSizeMask := 0;
- RegZMMSizeMask := 0;
- RegMMXConstSizeMask := 0;
- RegXMMConstSizeMask := 0;
- RegYMMConstSizeMask := 0;
- RegZMMConstSizeMask := 0;
- RegBCSTSizeMask:= 0;
- RegBCSTXMMSizeMask := 0;
- RegBCSTYMMSizeMask := 0;
- RegBCSTZMMSizeMask := 0;
- ExistsMemRef := false;
- while (insentry^.opcode=AsmOp) do
- begin
- MRefInfo := msiUnknown;
- actRegSize := 0;
- actRegCount := 0;
- actRegTypes := 0;
- NewRegSize := 0;
- actMemSize := 0;
- actMemCount := 0;
- actRegMemTypes := 0;
- actVMemCount := 0;
- actVMemTypes := 0;
- actConstSize := 0;
- actConstCount := 0;
- ExistsCode336 := false; // indicate fixed operand size 32 bit
- ExistsCode337 := false; // indicate fixed operand size 64 bit
- ExistsSSEAVXReg := false;
- // parse insentry^.code for &336 and &337
- // &336 (octal) = 222 (decimal) == fixed operand size 32 bit
- // &337 (octal) = 223 (decimal) == fixed operand size 64 bit
- for i := low(insentry^.code) to high(insentry^.code) do
- begin
- case insentry^.code[i] of
- #222: ExistsCode336 := true;
- #223: ExistsCode337 := true;
- #0,#1,#2,#3: break;
- end;
- end;
- for i := 0 to insentry^.ops -1 do
- begin
- if (insentry^.optypes[i] and OT_REGISTER) = OT_REGISTER then
- case insentry^.optypes[i] and (OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_KREG or OT_REG_EXTRA_MASK) of
- OT_XMMREG,
- OT_YMMREG,
- OT_ZMMREG: ExistsSSEAVXReg := true;
- else;
- end;
- end;
- for j := 0 to insentry^.ops -1 do
- begin
- if ((insentry^.optypes[j] and OT_XMEM32) = OT_XMEM32) OR
- ((insentry^.optypes[j] and OT_XMEM64) = OT_XMEM64) OR
- ((insentry^.optypes[j] and OT_YMEM32) = OT_YMEM32) OR
- ((insentry^.optypes[j] and OT_YMEM64) = OT_YMEM64) OR
- ((insentry^.optypes[j] and OT_ZMEM32) = OT_ZMEM32) OR
- ((insentry^.optypes[j] and OT_ZMEM64) = OT_ZMEM64) then
- begin
- inc(actVMemCount);
- case insentry^.optypes[j] and (OT_XMEM32 OR OT_XMEM64 OR OT_YMEM32 OR OT_YMEM64 OR OT_ZMEM32 OR OT_ZMEM64) of
- OT_XMEM32: actVMemTypes := actVMemTypes or OT_XMEM32;
- OT_XMEM64: actVMemTypes := actVMemTypes or OT_XMEM64;
- OT_YMEM32: actVMemTypes := actVMemTypes or OT_YMEM32;
- OT_YMEM64: actVMemTypes := actVMemTypes or OT_YMEM64;
- OT_ZMEM32: actVMemTypes := actVMemTypes or OT_ZMEM32;
- OT_ZMEM64: actVMemTypes := actVMemTypes or OT_ZMEM64;
- else;
- end;
- end
- else if (insentry^.optypes[j] and OT_REGISTER) = OT_REGISTER then
- begin
- inc(actRegCount);
- NewRegSize := (insentry^.optypes[j] and OT_SIZE_MASK);
- if NewRegSize = 0 then
- begin
- 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
- OT_MMXREG: begin
- NewRegSize := OT_BITS64;
- end;
- OT_XMMREG: begin
- NewRegSize := OT_BITS128;
- InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
- end;
- OT_YMMREG: begin
- NewRegSize := OT_BITS256;
- InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
- end;
- OT_ZMMREG: begin
- NewRegSize := OT_BITS512;
- InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
- end;
- OT_KREG: begin
- InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
- end;
- else NewRegSize := not(0);
- end;
- end;
- actRegSize := actRegSize or NewRegSize;
- 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));
- end
- else if ((insentry^.optypes[j] and OT_MEMORY) <> 0) then
- begin
- inc(actMemCount);
- if ExistsSSEAVXReg and ExistsCode336 then
- actMemSize := actMemSize or OT_BITS32
- else if ExistsSSEAVXReg and ExistsCode337 then
- actMemSize := actMemSize or OT_BITS64
- else
- actMemSize:=actMemSize or (insentry^.optypes[j] and (OT_SIZE_MASK OR OT_VECTORBCST));
- if (insentry^.optypes[j] and OT_REGMEM) = OT_REGMEM then
- begin
- actRegMemTypes := actRegMemTypes or insentry^.optypes[j];
- end;
- end
- else if ((insentry^.optypes[j] and OT_IMMEDIATE) = OT_IMMEDIATE) then
- begin
- inc(actConstCount);
- actConstSize := actConstSize or (insentry^.optypes[j] and OT_SIZE_MASK);
- end
- end;
- if actConstCount > 0 then
- begin
- case actConstSize of
- 0: SConstInfo := csiNoSize;
- OT_BITS8: SConstInfo := csiMem8;
- OT_BITS16: SConstInfo := csiMem16;
- OT_BITS32: SConstInfo := csiMem32;
- OT_BITS64: SConstInfo := csiMem64;
- else SConstInfo := csiMultiple;
- end;
- if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize = csiUnknown then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := SConstInfo;
- end
- else if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize <> SConstInfo then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiMultiple;
- end;
- end;
- if actVMemCount > 0 then
- begin
- if actVMemCount = 1 then
- begin
- if actVMemTypes > 0 then
- begin
- case actVMemTypes of
- OT_XMEM32: MRefInfo := msiXMem32;
- OT_XMEM64: MRefInfo := msiXMem64;
- OT_YMEM32: MRefInfo := msiYMem32;
- OT_YMEM64: MRefInfo := msiYMem64;
- OT_ZMEM32: MRefInfo := msiZMem32;
- OT_ZMEM64: MRefInfo := msiZMem64;
- else;
- end;
- case actRegTypes of
- OT_XMMREG: case MRefInfo of
- msiXMem32,
- msiXMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS128;
- msiYMem32,
- msiYMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS256;
- msiZMem32,
- msiZMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS512;
- else;
- end;
- OT_YMMREG: case MRefInfo of
- msiXMem32,
- msiXMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS128;
- msiYMem32,
- msiYMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS256;
- msiZMem32,
- msiZMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS512;
- else;
- end;
- OT_ZMMREG: case MRefInfo of
- msiXMem32,
- msiXMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS128;
- msiYMem32,
- msiYMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS256;
- msiZMem32,
- msiZMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS512;
- else;
- end;
- //else InternalError(777209);
- end;
- if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
- end
- else if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> MRefInfo then
- begin
- if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize in [msiXMem32, msiXMem64, msiYMem32, msiYMem64, msiZMem32, msiZMem64] then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiVMemMultiple;
- end
- else if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> msiVMemMultiple then;
- end;
- end;
- end
- else;
- end
- else
- begin
- if (actMemCount=2) and ((AsmOp=A_MOVS) or (AsmOp=A_CMPS)) then actMemCount:=1;
- ExistsMemRef := ExistsMemRef or (actMemCount > 0);
- case actMemCount of
- 0: ; // nothing todo
- 1: begin
- MRefInfo := msiUnknown;
- if not(ExistsCode336 or ExistsCode337) then
- case actRegMemTypes and (OT_MMXRM or OT_XMMRM or OT_YMMRM or OT_ZMMRM or OT_REG_EXTRA_MASK) of
- OT_MMXRM: actMemSize := actMemSize or OT_BITS64;
- OT_XMMRM: actMemSize := actMemSize or OT_BITS128;
- OT_YMMRM: actMemSize := actMemSize or OT_BITS256;
- OT_ZMMRM: actMemSize := actMemSize or OT_BITS512;
- end;
- case actMemSize of
- 0: MRefInfo := msiNoSize;
- OT_BITS8: MRefInfo := msiMem8;
- OT_BITS16: MRefInfo := msiMem16;
- OT_BITS32: MRefInfo := msiMem32;
- OT_BITSB32: MRefInfo := msiBMem32;
- OT_BITS64: MRefInfo := msiMem64;
- OT_BITSB64: MRefInfo := msiBMem64;
- OT_BITS128: MRefInfo := msiMem128;
- OT_BITS256: MRefInfo := msiMem256;
- OT_BITS512: MRefInfo := msiMem512;
- OT_BITS80,
- OT_FAR,
- OT_NEAR,
- OT_SHORT: ; // ignore
- else
- begin
- bitcount := bitcnt(actMemSize);
- if bitcount > 1 then MRefInfo := msiMultiple
- else;
- end;
- end;
- if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
- end
- else
- begin
- // ignore broadcast-memory
- if not(MRefInfo in [msiBMem32, msiBMem64]) then
- begin
- if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> MRefInfo then
- begin
- with InsTabMemRefSizeInfoCache^[AsmOp] do
- begin
- if ((MemRefSize in [msiMem8, msiMULTIPLEMinSize8]) OR (MRefInfo = msiMem8)) then MemRefSize := msiMultipleMinSize8
- else if ((MemRefSize in [ msiMem16, msiMULTIPLEMinSize16]) OR (MRefInfo = msiMem16)) then MemRefSize := msiMultipleMinSize16
- else if ((MemRefSize in [ msiMem32, msiMULTIPLEMinSize32]) OR (MRefInfo = msiMem32)) then MemRefSize := msiMultipleMinSize32
- else if ((MemRefSize in [ msiMem64, msiMULTIPLEMinSize64]) OR (MRefInfo = msiMem64)) then MemRefSize := msiMultipleMinSize64
- else if ((MemRefSize in [msiMem128, msiMULTIPLEMinSize128]) OR (MRefInfo = msiMem128)) then MemRefSize := msiMultipleMinSize128
- else if ((MemRefSize in [msiMem256, msiMULTIPLEMinSize256]) OR (MRefInfo = msiMem256)) then MemRefSize := msiMultipleMinSize256
- else if ((MemRefSize in [msiMem512, msiMULTIPLEMinSize512]) OR (MRefInfo = msiMem512)) then MemRefSize := msiMultipleMinSize512
- else MemRefSize := msiMultiple;
- end;
- end;
- end;
- end;
- //if not(MRefInfo in [msiBMem32, msiBMem64]) and (actRegCount > 0) then
- if actRegCount > 0 then
- begin
- if MRefInfo in [msiBMem32, msiBMem64] then
- begin
- if IF_BCST2 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to2];
- if IF_BCST4 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to4];
- if IF_BCST8 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to8];
- if IF_BCST16 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to16];
- //InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes
- // BROADCAST - OPERAND
- RegBCSTSizeMask := RegBCSTSizeMask or actMemSize;
- case actRegTypes and (OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_REG_EXTRA_MASK) of
- OT_XMMREG: RegBCSTXMMSizeMask := RegBCSTXMMSizeMask or actMemSize;
- OT_YMMREG: RegBCSTYMMSizeMask := RegBCSTYMMSizeMask or actMemSize;
- OT_ZMMREG: RegBCSTZMMSizeMask := RegBCSTZMMSizeMask or actMemSize;
- else begin
- RegBCSTXMMSizeMask := not(0);
- RegBCSTYMMSizeMask := not(0);
- RegBCSTZMMSizeMask := not(0);
- end;
- end;
- end
- else
- case actRegTypes and (OT_MMXREG or OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_REG_EXTRA_MASK) of
- OT_MMXREG: if actConstCount > 0 then RegMMXConstSizeMask := RegMMXConstSizeMask or actMemSize
- else RegMMXSizeMask := RegMMXSizeMask or actMemSize;
- OT_XMMREG: if actConstCount > 0 then RegXMMConstSizeMask := RegXMMConstSizeMask or actMemSize
- else RegXMMSizeMask := RegXMMSizeMask or actMemSize;
- OT_YMMREG: if actConstCount > 0 then RegYMMConstSizeMask := RegYMMConstSizeMask or actMemSize
- else RegYMMSizeMask := RegYMMSizeMask or actMemSize;
- OT_ZMMREG: if actConstCount > 0 then RegZMMConstSizeMask := RegZMMConstSizeMask or actMemSize
- else RegZMMSizeMask := RegZMMSizeMask or actMemSize;
- else begin
- RegMMXSizeMask := not(0);
- RegXMMSizeMask := not(0);
- RegYMMSizeMask := not(0);
- RegZMMSizeMask := not(0);
- RegMMXConstSizeMask := not(0);
- RegXMMConstSizeMask := not(0);
- RegYMMConstSizeMask := not(0);
- RegZMMConstSizeMask := not(0);
- end;
- end;
- end
- else
- end
- else;
- end;
- end;
- inc(insentry);
- end;
- if InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX then
- begin
- case RegBCSTSizeMask of
- 0: ; // ignore;
- OT_BITSB32: begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbBCST32;
- InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 4;
- end;
- OT_BITSB64: begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbBCST64;
- InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 2;
- end;
- else begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbMultiple;
- end;
- end;
- end;
- if (InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize in MemRefMultiples) and
- (InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX)then
- begin
- if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiVMemMultiple then
- begin
- if ((RegXMMSizeMask = OT_BITS128) or (RegXMMSizeMask = 0)) and
- ((RegYMMSizeMask = OT_BITS256) or (RegYMMSizeMask = 0)) and
- ((RegZMMSizeMask = OT_BITS512) or (RegZMMSizeMask = 0)) and
- ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) <> 0) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiVMemRegSize;
- end;
- end
- else if (RegMMXSizeMask or RegMMXConstSizeMask) <> 0 then
- begin
- if ((RegMMXSizeMask or RegMMXConstSizeMask) = OT_BITS64) and
- ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS128) and
- ((RegYMMSizeMask or RegYMMConstSizeMask) = 0) and
- ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegSize;
- end;
- end
- else if (((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS128) or ((RegXMMSizeMask or RegXMMConstSizeMask) = 0)) and
- (((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) or ((RegYMMSizeMask or RegYMMConstSizeMask) = 0)) and
- (((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS512) or ((RegZMMSizeMask or RegZMMConstSizeMask) = 0)) and
- (((RegXMMSizeMask or RegXMMConstSizeMask or
- RegYMMSizeMask or RegYMMConstSizeMask or
- RegZMMSizeMask or RegZMMConstSizeMask)) <> 0) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegSize;
- end
- else if (RegXMMSizeMask or RegXMMConstSizeMask = OT_BITS16) and
- (RegYMMSizeMask or RegYMMConstSizeMask = OT_BITS32) and
- (RegZMMSizeMask or RegZMMConstSizeMask = 0) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx16y32;
- end
- else if (RegXMMSizeMask or RegXMMConstSizeMask = OT_BITS16) and
- (RegYMMSizeMask or RegYMMConstSizeMask = OT_BITS32) and
- (RegZMMSizeMask or RegZMMConstSizeMask = OT_BITS64) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx16y32z64;
- end
- else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS32) and
- ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS64) then
- begin
- if ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx32y64;
- end
- else if ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS128) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx32y64z128;
- end;
- end
- else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
- ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS128) and
- ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y128;
- end
- else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
- ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS128) and
- ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS256) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y128z256;
- end
- else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
- ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) and
- ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y256;
- end
- else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
- ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) and
- ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS512) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y256z512;
- end
- else if ((RegXMMConstSizeMask = 0) or (RegXMMConstSizeMask = OT_BITS128)) and
- ((RegYMMConstSizeMask = 0) or (RegYMMConstSizeMask = OT_BITS256)) and
- ((RegZMMConstSizeMask = 0) or (RegZMMConstSizeMask = OT_BITS512)) and
- ((RegXMMConstSizeMask or RegYMMConstSizeMask or RegZMMConstSizeMask) <> 0) and
- (
- ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS128) or
- ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS256) or
- ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS512)
- ) then
- begin
- case RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask of
- OT_BITS128: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst128;
- OT_BITS256: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst256;
- OT_BITS512: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst512;
- else InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMultiple;
- end;
- end
- else
- begin
- if not(
- (AsmOp = A_CVTSI2SS) or
- (AsmOp = A_CVTSI2SD) or
- (AsmOp = A_CVTPD2DQ) or
- (AsmOp = A_VCVTPD2DQ) or
- (AsmOp = A_VCVTPD2PS) or
- (AsmOp = A_VCVTSI2SD) or
- (AsmOp = A_VCVTSI2SS) or
- (AsmOp = A_VCVTTPD2DQ) or
- (AsmOp = A_VCVTPD2UDQ) or
- (AsmOp = A_VCVTQQ2PS) or
- (AsmOp = A_VCVTTPD2UDQ) or
- (AsmOp = A_VCVTUQQ2PS) or
- (AsmOp = A_VCVTUSI2SD) or
- (AsmOp = A_VCVTUSI2SS) or
- // TODO check
- (AsmOp = A_VCMPSS)
- ) then;
- end;
- end
- else if (InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) and
- (InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown) and
- (not(ExistsMemRef)) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiNoMemRef;
- end;
- InsTabMemRefSizeInfoCache^[AsmOp].RegXMMSizeMask:=RegXMMSizeMask;
- InsTabMemRefSizeInfoCache^[AsmOp].RegYMMSizeMask:=RegYMMSizeMask;
- InsTabMemRefSizeInfoCache^[AsmOp].RegZMMSizeMask:=RegZMMSizeMask;
- end;
- end;
- for AsmOp := low(TAsmOp) to high(TAsmOp) do
- begin
- // only supported intructiones with SSE- or AVX-operands
- if not(InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) then
- begin
- InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiUnknown;
- InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiUnknown;
- end;
- end;
- end;
- { TOperandListItem }
- constructor TOperandListItem.Create;
- begin
- inherited;
- FOpActive := false;
- FOpNumber := -1;
- FOpTyp := otUnknown;
- FValues := TStringList.Create;
- end;
- destructor TOperandListItem.Destroy;
- begin
- FreeAndNil(FValues);
- inherited;
- end;
- { TOperandList }
- function TOperandList.Add(aItem: TOperandListItem): integer;
- begin
- result := FList.Add(aItem);
- end;
- function TOperandList.GetItems(aIndex: integer): TOperandListItem;
- begin
- result := TOperandListItem(FList[aIndex]);
- end;
- { TAsmTestGenerator }
- function TAsmTestGenerator.InternalCalcTestData(const aInst, aOp1, aOp2, aOp3,
- aOp4: String): TStringList;
- var
- i: integer;
- Item: TOperandListItem;
- OItem1: TOperandListItem;
- OItem2: TOperandListItem;
- OItem3: TOperandListItem;
- OItem4: TOperandListItem;
- il_Op: integer;
- il_Op1: integer;
- il_Op2: integer;
- il_Op3: integer;
- il_Op4: integer;
- sSuffix: string;
- sl_Operand: String;
- sl_Inst : String;
- sl_RegCombi: String;
- sl_Prefix: String;
- UsePrefix: boolean;
- il_Operands: integer;
- UsedParams: cardinal;
- UseDefault: boolean;
- sl_RegCombi1: string;
- sl_RegCombi2: string;
- sl_RegCombi3: string;
- MaskRegNeeded:boolean;
- function PrepareOperandTyp(const aTyp: String): String;
- begin
- result := aTyp;
- if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
- if result = 'XMMRM128' then result := 'XMMRM';
- if result = 'YMMRM256' then result := 'YMMRM';
- end;
- begin
- result := TStringList.Create;
- OItem1 := TOperandListItem.Create;
- try
- OItem2 := TOperandListItem.Create;
- try
- OItem3 := TOperandListItem.Create;
- try
- OItem4 := TOperandListItem.Create;
- try
- UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
- (UpperCase(aInst) = 'VCVTPD2PS') OR
- (UpperCase(aInst) = 'VCVTSI2SD') OR
- (UpperCase(aInst) = 'VCVTSI2SS') OR
- (UpperCase(aInst) = 'VCVTTPD2DQ') or
- (UpperCase(aInst) = 'VPMOVZXWQ') or
- (UpperCase(aInst) = 'VCVTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTUQQ2PS') or
- (UpperCase(aInst) = 'VCVTQQ2PS') or
- (UpperCase(aInst) = 'VCVTUSI2SD') or
- (UpperCase(aInst) = 'VCVTUSI2SS') or
- (UpperCase(aInst) = 'VFPCLASSPD') or
- (UpperCase(aInst) = 'VFPCLASSPS') or
- (UpperCase(aInst) = 'VCMPSS')
- ;
-
- MaskRegNeeded := (Pos('VGATHER', Uppercase(aInst)) = 1) or
- (Pos('VPGATHER', Uppercase(aInst)) = 1) or
- (Pos('VPSCATTER', Uppercase(aInst)) = 1) or
- (Pos('VSCATTER', Uppercase(aInst)) = 1);
- for il_Op := 1 to 4 do
- begin
- sl_Prefix := '';
- case il_Op of
- 1: begin
- Item := OItem1;
- sl_Operand := aOp1;
- end;
- 2: begin
- Item := OItem2;
- sl_Operand := aOp2;
- end;
- 3: begin
- Item := OItem3;
- sl_Operand := aOp3;
- end;
- 4: begin
- Item := OItem4;
- sl_Operand := aOp4;
- end;
- end;
- sl_Operand := PrepareOperandTyp(sl_Operand);
- if (AnsiSameText(sl_Operand, 'XMMREG')) or
- (AnsiSameText(sl_Operand, 'XMMREG_M')) or
- (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMReg;
- Item.OpActive := true;
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM1' + sSuffix);
- Item.Values.Add('XMM2' + sSuffix);
- Item.Values.Add('XMM3' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM5' + sSuffix);
- Item.Values.Add('XMM6' + sSuffix);
- Item.Values.Add('XMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM9' + sSuffix);
- Item.Values.Add('XMM18' + sSuffix);
- Item.Values.Add('XMM27' + sSuffix);
- Item.Values.Add('XMM31' + sSuffix);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- begin
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM9');
- Item.Values.Add('XMM18');
- Item.Values.Add('XMM27');
- Item.Values.Add('XMM31');
- end;
- end
- else
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM8' + sSuffix);
- Item.Values.Add('XMM12' + sSuffix);
- Item.Values.Add('XMM15' + sSuffix);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- begin
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM4');
- Item.Values.Add('XMM8');
- Item.Values.Add('XMM12');
- Item.Values.Add('XMM15');
- end;
- end;
- end;
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM')) or
- (AnsiSameText(sl_Operand, 'XMMRM_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
-
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM1' + sSuffix);
- Item.Values.Add('XMM2' + sSuffix);
- Item.Values.Add('XMM3' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM5' + sSuffix);
- Item.Values.Add('XMM6' + sSuffix);
- Item.Values.Add('XMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM9' + sSuffix);
- Item.Values.Add('XMM9');
- Item.Values.Add('XMM18' + sSuffix);
- Item.Values.Add('XMM18');
- Item.Values.Add('XMM27' + sSuffix);
- Item.Values.Add('XMM27');
- Item.Values.Add('XMM31' + sSuffix);
- Item.Values.Add('XMM31');
- end
- else
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM4');
- Item.Values.Add('XMM8' + sSuffix);
- Item.Values.Add('XMM8');
- Item.Values.Add('XMM12' + sSuffix);
- Item.Values.Add('XMM15');
- Item.Values.Add('XMM15' + sSuffix);
- end;
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM8;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'byte ';
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM1' + sSuffix);
- Item.Values.Add('XMM2' + sSuffix);
- Item.Values.Add('XMM3' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM5' + sSuffix);
- Item.Values.Add('XMM6' + sSuffix);
- Item.Values.Add('XMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM9' + sSuffix);
- Item.Values.Add('XMM9');
- Item.Values.Add('XMM18' + sSuffix);
- Item.Values.Add('XMM18');
- Item.Values.Add('XMM27' + sSuffix);
- Item.Values.Add('XMM27');
- Item.Values.Add('XMM31' + sSuffix);
- Item.Values.Add('XMM31');
- end
- else
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM4');
- Item.Values.Add('XMM8' + sSuffix);
- Item.Values.Add('XMM8');
- Item.Values.Add('XMM12' + sSuffix);
- Item.Values.Add('XMM12');
- Item.Values.Add('XMM15' + sSuffix);
- Item.Values.Add('XMM15');
- end;
- //Item.Values.Add('[RIP]');
- //Item.Values.Add('[RIP + 16]');
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM16;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'word ';
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM1' + sSuffix);
- Item.Values.Add('XMM2' + sSuffix);
- Item.Values.Add('XMM3' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM5' + sSuffix);
- Item.Values.Add('XMM6' + sSuffix);
- Item.Values.Add('XMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM9' + sSuffix);
- Item.Values.Add('XMM9');
- Item.Values.Add('XMM18' + sSuffix);
- Item.Values.Add('XMM18');
- Item.Values.Add('XMM27' + sSuffix);
- Item.Values.Add('XMM27');
- Item.Values.Add('XMM31' + sSuffix);
- Item.Values.Add('XMM31');
- end
- else
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM4');
- Item.Values.Add('XMM8' + sSuffix);
- Item.Values.Add('XMM8');
- Item.Values.Add('XMM12' + sSuffix);
- Item.Values.Add('XMM12');
- Item.Values.Add('XMM15' + sSuffix);
- Item.Values.Add('XMM15');
- end;
- //Item.Values.Add('[RIP]');
- //Item.Values.Add('[RIP + 16]');
- MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if (AnsiSameText(sl_Operand, 'YMMREG')) or
- (AnsiSameText(sl_Operand, 'YMMREG_M')) or
- (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMMReg;
- Item.OpActive := true;
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM1' + sSuffix);
- Item.Values.Add('YMM2' + sSuffix);
- Item.Values.Add('YMM3' + sSuffix);
- Item.Values.Add('YMM4' + sSuffix);
- Item.Values.Add('YMM5' + sSuffix);
- Item.Values.Add('YMM6' + sSuffix);
- Item.Values.Add('YMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM9' + sSuffix);
- Item.Values.Add('YMM18' + sSuffix);
- Item.Values.Add('YMM27' + sSuffix);
- Item.Values.Add('YMM31' + sSuffix);
-
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- begin
- Item.Values.Add('YMM0');
- Item.Values.Add('YMM9');
- Item.Values.Add('YMM18');
- Item.Values.Add('YMM27');
- Item.Values.Add('YMM31');
- end;
- end
- else
- begin
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM4' + sSuffix);
- Item.Values.Add('YMM8' + sSuffix);
- Item.Values.Add('YMM12' + sSuffix);
- Item.Values.Add('YMM15' + sSuffix);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- begin
- Item.Values.Add('YMM0');
- Item.Values.Add('YMM4');
- Item.Values.Add('YMM8');
- Item.Values.Add('YMM12');
- Item.Values.Add('YMM15');
- end;
- end;
- end;
- end
- else if (AnsiSameText(sl_Operand, 'YMMRM')) or
- (AnsiSameText(sl_Operand, 'YMMRM_M')) or
- (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM1' + sSuffix);
- Item.Values.Add('YMM2' + sSuffix);
- Item.Values.Add('YMM3' + sSuffix);
- Item.Values.Add('YMM4' + sSuffix);
- Item.Values.Add('YMM5' + sSuffix);
- Item.Values.Add('YMM6' + sSuffix);
- Item.Values.Add('YMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM9' + sSuffix);
- Item.Values.Add('YMM18' + sSuffix);
- Item.Values.Add('YMM27' + sSuffix);
- Item.Values.Add('YMM31' + sSuffix);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- begin
- Item.Values.Add('YMM0');
- Item.Values.Add('YMM9');
- Item.Values.Add('YMM18');
- Item.Values.Add('YMM27');
- Item.Values.Add('YMM31');
- end;
- end
- else
- begin
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM4' + sSuffix);
- Item.Values.Add('YMM8' + sSuffix);
- Item.Values.Add('YMM12' + sSuffix);
- Item.Values.Add('YMM15' + sSuffix);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- begin
- Item.Values.Add('YMM0');
- Item.Values.Add('YMM4');
- Item.Values.Add('YMM8');
- Item.Values.Add('YMM12');
- Item.Values.Add('YMM15');
- end;
- end;
- MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMMReg;
- Item.OpActive := true;
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM1' + sSuffix);
- Item.Values.Add('ZMM2' + sSuffix);
- Item.Values.Add('ZMM3' + sSuffix);
- Item.Values.Add('ZMM4' + sSuffix);
- Item.Values.Add('ZMM5' + sSuffix);
- Item.Values.Add('ZMM6' + sSuffix);
- Item.Values.Add('ZMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM9' + sSuffix);
- Item.Values.Add('ZMM18' + sSuffix);
- Item.Values.Add('ZMM27' + sSuffix);
- Item.Values.Add('ZMM31' + sSuffix);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- begin
- Item.Values.Add('ZMM0');
- Item.Values.Add('ZMM9');
- Item.Values.Add('ZMM18');
- Item.Values.Add('ZMM27');
- Item.Values.Add('ZMM31');
- end;
- end
- else
- begin
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM4' + sSuffix);
- Item.Values.Add('ZMM8' + sSuffix);
- Item.Values.Add('ZMM12' + sSuffix);
- Item.Values.Add('ZMM15' + sSuffix);
- end;
- end;
- end
- else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM1' + sSuffix);
- Item.Values.Add('ZMM2' + sSuffix);
- Item.Values.Add('ZMM3' + sSuffix);
- Item.Values.Add('ZMM4' + sSuffix);
- Item.Values.Add('ZMM5' + sSuffix);
- Item.Values.Add('ZMM6' + sSuffix);
- Item.Values.Add('ZMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM9' + sSuffix);
- Item.Values.Add('ZMM18' + sSuffix);
- Item.Values.Add('ZMM27' + sSuffix);
- Item.Values.Add('ZMM31' + sSuffix);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- begin
- Item.Values.Add('ZMM0');
- Item.Values.Add('ZMM9');
- Item.Values.Add('ZMM18');
- Item.Values.Add('ZMM27');
- Item.Values.Add('ZMM31');
- end;
- end
- else
- begin
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM4' + sSuffix);
- Item.Values.Add('ZMM8' + sSuffix);
- Item.Values.Add('ZMM12' + sSuffix);
- Item.Values.Add('ZMM15' + sSuffix);
- end;
- MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'MEM8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM8;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'byte ';
-
- sSuffix := '';
-
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'MEM16') or
- AnsiSameText(sl_Operand, 'MEM16_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM16;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'word ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'MEM32') or
- AnsiSameText(sl_Operand, 'MEM32_M') or
- AnsiSameText(sl_Operand, 'MEM32_MZ') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'dword ';
- sSuffix := '';
-
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM64')) or
- (AnsiSameText(sl_Operand, 'MEM64_M')) or
- (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'qword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM128')) or
- (AnsiSameText(sl_Operand, 'MEM128_M')) or
- (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM128;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM256')) or
- (AnsiSameText(sl_Operand, 'MEM256_M')) or
- (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM256;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM512')) or
- (AnsiSameText(sl_Operand, 'MEM512_M')) or
- (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM512;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'REG8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG8;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg8);
- end
- else Item.Values.AddStrings(FReg8);
- end
- else if AnsiSameText(sl_Operand, 'REG16') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG16;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg16);
- end
- else Item.Values.AddStrings(FReg16);
- end
- else if AnsiSameText(sl_Operand, 'REG32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG32;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg32Base);
- end
- else Item.Values.AddStrings(FReg32Base);
- end
- else if AnsiSameText(sl_Operand, 'REG64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG64;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg64Base);
- end;
- end
- else if AnsiSameText(sl_Operand, 'RM32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otRM32;
- Item.OpActive := true;
- Item.Values.AddStrings(FReg32Base);
- if UsePrefix then sl_Prefix := 'dword ';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'RM64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otRM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'qword ';
- if x64 then
- begin
- Item.Values.AddStrings(FReg64Base);
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'IMM8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otIMM8;
- Item.OpActive := true;
- Item.Values.Add('0');
- end
- else if AnsiSameText(sl_Operand, 'XMEM32') or
- AnsiSameText(sl_Operand, 'XMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'XMEM64') or
- AnsiSameText(sl_Operand, 'XMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMEM64;
- Item.OpActive := true;
- //if UsePrefix then sl_Prefix := 'oword ';
- //
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'YMEM32') or
- AnsiSameText(sl_Operand, 'YMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'YMEM64') or
- AnsiSameText(sl_Operand, 'YMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'ZMEM32') or
- AnsiSameText(sl_Operand, 'ZMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'ZMEM64') or
- AnsiSameText(sl_Operand, 'ZMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, '2B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '4B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '8B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '16B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '2B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '4B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '8B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '16B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'KREG') or
- AnsiSameText(sl_Operand, 'KREG_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otKREG;
- Item.OpActive := true;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if UsePrefix then sl_Prefix := '';
- for i := 0 to FRegKREG.Count - 1 do
- Item.Values.Add(FRegKREG[i] + sSuffix);
- end
- else if trim(sl_Operand) = '' then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otUnknown;
- Item.OpActive := false;
- Item.Values.Add('');
- end
- else
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otUnknown;
- Item.OpActive := false;
- Item.Values.Add('?' + sl_Operand);
- end
- end;
- sl_RegCombi := '';
- il_Operands := 0;
- UsedParams := 0;
- if OItem1.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 1;
- end;
- if OItem2.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 2;
- end;
- if OItem3.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 4;
- end;
- if OItem4.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 8;
- end;
- case il_Operands of
- 1: UseDefault := UsedParams <> 1;
- 2: UseDefault := UsedParams <> 3;
- 3: UseDefault := UsedParams <> 7;
- 4: UseDefault := UsedParams <> 15;
- else UseDefault := true;
- end;
- //UseDefault := true;
- if UseDefault then
- begin
- sl_Inst := format('%-20s', [aInst]);
- for il_Op1 := 0 to OItem1.Values.Count - 1 do
- begin
- for il_Op2 := 0 to OItem2.Values.Count - 1 do
- begin
- for il_Op3 := 0 to OItem3.Values.Count - 1 do
- begin
- for il_Op4 := 0 to OItem4.Values.Count - 1 do
- begin
- sl_RegCombi := '';
- if OItem1.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
- end;
- if OItem2.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
- end;
- if OItem3.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
- end;
- if OItem4.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
- end;
- if sl_RegCombi <> '' then
- begin
- //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
- result.Add(sl_Inst + sl_RegCombi);
- sl_RegCombi := '';
- end;
- end;
- end;
- end;
- end;
- end
- else
- begin
- sl_Inst := format('%-20s', [aInst]);
- for il_Op1 := 0 to OItem1.Values.Count - 1 do
- begin
- if OItem1.OpActive then
- begin
- sl_RegCombi1 := OItem1.Values[il_Op1];
- end
- else sl_RegCombi1 := '';
- for il_Op2 := 0 to OItem2.Values.Count - 1 do
- begin
- if OItem2.OpActive then
- begin
- sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
- end
- else sl_RegCombi2 := sl_RegCombi1;
- for il_Op3 := 0 to OItem3.Values.Count - 1 do
- begin
- if OItem3.OpActive then
- begin
- sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
- end
- else sl_RegCombi3 := sl_RegCombi2;
- for il_Op4 := 0 to OItem4.Values.Count - 1 do
- begin
- if OItem4.OpActive then
- begin
- sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
- end
- else sl_RegCombi := sl_RegCombi3;
- if sl_RegCombi <> '' then
- begin
- //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
- result.Add(sl_Inst + sl_RegCombi);
- sl_RegCombi := '';
- end;
- end;
- end;
- end;
- end;
- end;
- finally
- FreeAndNil(OItem4);
- end;
- finally
- FreeAndNil(OItem3);
- end;
- finally
- FreeAndNil(OItem2);
- end;
- finally
- FreeAndNil(OItem1);
- end;
- end;
- function TAsmTestGenerator.InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3,
- aOp4: String): TStringList;
- var
- i: integer;
- Item: TOperandListItem;
- OItem1: TOperandListItem;
- OItem2: TOperandListItem;
- OItem3: TOperandListItem;
- OItem4: TOperandListItem;
- il_Op: integer;
- il_Op1: integer;
- il_Op2: integer;
- il_Op3: integer;
- il_Op4: integer;
- sSuffix: string;
- sl_Operand: String;
- sl_Inst : String;
- sl_RegCombi: String;
- sl_Prefix: String;
- UsePrefix: boolean;
- il_Operands: integer;
- UsedParams: cardinal;
- UseDefault: boolean;
- sl_RegCombi1: string;
- sl_RegCombi2: string;
- sl_RegCombi3: string;
- function PrepareOperandTyp(const aTyp: String): String;
- begin
- result := aTyp;
- if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
- if result = 'XMMRM128' then result := 'XMMRM';
- if result = 'YMMRM256' then result := 'YMMRM';
- end;
- begin
- result := TStringList.Create;
- OItem1 := TOperandListItem.Create;
- try
- OItem2 := TOperandListItem.Create;
- try
- OItem3 := TOperandListItem.Create;
- try
- OItem4 := TOperandListItem.Create;
- try
- UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
- (UpperCase(aInst) = 'VCVTPD2PS') OR
- (UpperCase(aInst) = 'VCVTSI2SD') OR
- (UpperCase(aInst) = 'VCVTSI2SS') OR
- (UpperCase(aInst) = 'VCVTTPD2DQ') or
- (UpperCase(aInst) = 'VPMOVZXWQ') or
- (UpperCase(aInst) = 'VCVTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTUQQ2PS') or
- (UpperCase(aInst) = 'VCVTQQ2PS') or
- (UpperCase(aInst) = 'VCVTUSI2SD') or
- (UpperCase(aInst) = 'VCVTUSI2SS') or
- (UpperCase(aInst) = 'VFPCLASSPD') or
- (UpperCase(aInst) = 'VFPCLASSPS') or
- (UpperCase(aInst) = 'VCMPSS')
- ;
- for il_Op := 1 to 4 do
- begin
- sl_Prefix := '';
- case il_Op of
- 1: begin
- Item := OItem1;
- sl_Operand := aOp1;
- end;
- 2: begin
- Item := OItem2;
- sl_Operand := aOp2;
- end;
- 3: begin
- Item := OItem3;
- sl_Operand := aOp3;
- end;
- 4: begin
- Item := OItem4;
- sl_Operand := aOp4;
- end;
- end;
- sl_Operand := PrepareOperandTyp(sl_Operand);
- if (AnsiSameText(sl_Operand, 'XMMREG')) or
- (AnsiSameText(sl_Operand, 'XMMREG_M')) or
- (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMReg;
- Item.OpActive := true;
- Item.Values.Add('XMM0');
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM')) or
- (AnsiSameText(sl_Operand, 'XMMRM_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
- Item.Values.Add(' lOWord');
- Item.Values.Add(' gOWord');
- Item.Values.Add(' clOWord');
- Item.Values.Add(' cgOWord');
- Item.Values.Add(' oword lOWord');
- Item.Values.Add(' oword gOWord');
- Item.Values.Add(' oword clOWord');
- Item.Values.Add(' oword cgOWord');
- Item.Values.Add(' byte lOWord');
- Item.Values.Add(' byte gOWord');
- Item.Values.Add(' byte clOWord');
- Item.Values.Add(' byte cgOWord');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' oword lRec');
- Item.Values.Add(' oword gRec');
- Item.Values.Add(' oword lRec.rOWord');
- Item.Values.Add(' oword gRec.rOWord');
- Item.Values.Add(' lRec.rByte');
- Item.Values.Add(' gRec.rByte');
- Item.Values.Add(' lRec.rWord');
- Item.Values.Add(' gRec.rWord');
- Item.Values.Add(' lRec.rDWord');
- Item.Values.Add(' gRec.rDWord');
- Item.Values.Add(' lRec.rQWord');
- Item.Values.Add(' gRec.rQWord');
- Item.Values.Add(' lRec.rOWord');
- Item.Values.Add(' gRec.rOWord');
- Item.Values.Add(' lRec.rYWord');
- Item.Values.Add(' gRec.rYWord');
- Item.Values.Add(' lRec.rZWord');
- Item.Values.Add(' gRec.rZWord');
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM8;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'byte ';
- Item.Values.Add('lbyte');
- Item.Values.Add('gbyte');
- Item.Values.Add('clbyte');
- Item.Values.Add('cgbyte');
- Item.Values.Add('byte lbyte');
- Item.Values.Add('byte gbyte');
- Item.Values.Add('byte clbyte');
- Item.Values.Add('byte cgbyte');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' byte lRec');
- Item.Values.Add(' byte gRec');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' lRec.rByte');
- Item.Values.Add(' gRec.rByte');
- Item.Values.Add(' lRec.rWord');
- Item.Values.Add(' gRec.rWord');
- Item.Values.Add(' lRec.rDWord');
- Item.Values.Add(' gRec.rDWord');
- Item.Values.Add(' lRec.rQWord');
- Item.Values.Add(' gRec.rQWord');
- Item.Values.Add(' lRec.rOWord');
- Item.Values.Add(' gRec.rOWord');
- Item.Values.Add(' lRec.rYWord');
- Item.Values.Add(' gRec.rYWord');
- Item.Values.Add(' lRec.rZWord');
- Item.Values.Add(' gRec.rZWord');
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM16;
- Item.OpActive := true;
- Item.Values.Add('lword');
- Item.Values.Add('gword');
- Item.Values.Add('clword');
- Item.Values.Add('cgword');
- Item.Values.Add('word lword');
- Item.Values.Add('word gword');
- Item.Values.Add('word clword');
- Item.Values.Add('word cgword');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' word lRec');
- Item.Values.Add(' word gRec');
- Item.Values.Add(' lRec.rByte');
- Item.Values.Add(' gRec.rByte');
- Item.Values.Add(' lRec.rWord');
- Item.Values.Add(' gRec.rWord');
- Item.Values.Add(' lRec.rDWord');
- Item.Values.Add(' gRec.rDWord');
- Item.Values.Add(' lRec.rQWord');
- Item.Values.Add(' gRec.rQWord');
- Item.Values.Add(' lRec.rOWord');
- Item.Values.Add(' gRec.rOWord');
- Item.Values.Add(' lRec.rYWord');
- Item.Values.Add(' gRec.rYWord');
- Item.Values.Add(' lRec.rZWord');
- Item.Values.Add(' gRec.rZWord');
- end
- else if (AnsiSameText(sl_Operand, 'YMMREG')) or
- (AnsiSameText(sl_Operand, 'YMMREG_M')) or
- (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMMReg;
- Item.OpActive := true;
- Item.Values.Add('YMM0');
- end
- else if (AnsiSameText(sl_Operand, 'YMMRM')) or
- (AnsiSameText(sl_Operand, 'YMMRM_M')) or
- (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMMRM;
- Item.OpActive := true;
- Item.Values.Add('lYWord');
- Item.Values.Add('gYWord');
- Item.Values.Add('clYWord');
- Item.Values.Add('cgYWord');
- Item.Values.Add('yword lYWord');
- Item.Values.Add('yword gYWord');
- Item.Values.Add('yword clYWord');
- Item.Values.Add('yword cgYWord');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' yword lRec');
- Item.Values.Add(' yword gRec');
- Item.Values.Add(' lRec.rByte');
- Item.Values.Add(' gRec.rByte');
- Item.Values.Add(' lRec.rWord');
- Item.Values.Add(' gRec.rWord');
- Item.Values.Add(' lRec.rDWord');
- Item.Values.Add(' gRec.rDWord');
- Item.Values.Add(' lRec.rQWord');
- Item.Values.Add(' gRec.rQWord');
- Item.Values.Add(' lRec.rOWord');
- Item.Values.Add(' gRec.rOWord');
- Item.Values.Add(' lRec.rYWord');
- Item.Values.Add(' gRec.rYWord');
- Item.Values.Add(' lRec.rZWord');
- Item.Values.Add(' gRec.rZWord');
- end
- else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMMReg;
- Item.OpActive := true;
- Item.Values.Add('ZMM0');
- end
- else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMMRM;
- Item.OpActive := true;
- Item.Values.Add('lZWord');
- Item.Values.Add('gZWord');
- Item.Values.Add('clZWord');
- Item.Values.Add('cgZWord');
- Item.Values.Add('zword lZWord');
- Item.Values.Add('zword gZWord');
- Item.Values.Add('zword clZWord');
- Item.Values.Add('zword cgZWord');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' zword lRec');
- Item.Values.Add(' zword gRec');
- Item.Values.Add(' lRec.rByte');
- Item.Values.Add(' gRec.rByte');
- Item.Values.Add(' lRec.rWord');
- Item.Values.Add(' gRec.rWord');
- Item.Values.Add(' lRec.rDWord');
- Item.Values.Add(' gRec.rDWord');
- Item.Values.Add(' lRec.rQWord');
- Item.Values.Add(' gRec.rQWord');
- Item.Values.Add(' lRec.rOWord');
- Item.Values.Add(' gRec.rOWord');
- Item.Values.Add(' lRec.rYWord');
- Item.Values.Add(' gRec.rYWord');
- Item.Values.Add(' lRec.rZWord');
- Item.Values.Add(' gRec.rZWord');
- end
- else if AnsiSameText(sl_Operand, 'MEM8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM8;
- Item.OpActive := true;
- Item.Values.Add('lByte');
- Item.Values.Add('gByte');
- Item.Values.Add('clByte');
- Item.Values.Add('cgByte');
- Item.Values.Add('byte lByte');
- Item.Values.Add('byte gByte');
- Item.Values.Add('byte clByte');
- Item.Values.Add('byte cgByte');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' byte lRec');
- Item.Values.Add(' byte gRec');
- Item.Values.Add(' lRec.rByte');
- Item.Values.Add(' gRec.rByte');
- end
- else if AnsiSameText(sl_Operand, 'MEM16') or
- AnsiSameText(sl_Operand, 'MEM16_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM16;
- Item.OpActive := true;
- Item.Values.Add('lWord');
- Item.Values.Add('gWord');
- Item.Values.Add('clWord');
- Item.Values.Add('cgWord');
- Item.Values.Add('word lWord');
- Item.Values.Add('word gWord');
- Item.Values.Add('word clWord');
- Item.Values.Add('word cgWord');
- Item.Values.Add(' word lRec');
- Item.Values.Add(' word gRec');
- Item.Values.Add(' lRec.rWord');
- Item.Values.Add(' gRec.rWord');
- end
- else if AnsiSameText(sl_Operand, 'MEM32') or
- AnsiSameText(sl_Operand, 'MEM32_M') or
- AnsiSameText(sl_Operand, 'MEM32_MZ') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM32;
- Item.OpActive := true;
- Item.Values.Add('lDWord');
- Item.Values.Add('gDWord');
- Item.Values.Add('clDWord');
- Item.Values.Add('cgDWord');
- Item.Values.Add('dword lDWord');
- Item.Values.Add('dword gDWord');
- Item.Values.Add('dword clDWord');
- Item.Values.Add('dword cgDWord');
- Item.Values.Add(' dword lRec');
- Item.Values.Add(' dword gRec');
- Item.Values.Add(' lRec.rDWord');
- Item.Values.Add(' gRec.rDWord');
- end
- else if (AnsiSameText(sl_Operand, 'MEM64')) or
- (AnsiSameText(sl_Operand, 'MEM64_M')) or
- (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM64;
- Item.OpActive := true;
- Item.Values.Add('lQWord');
- Item.Values.Add('gQWord');
- Item.Values.Add('clQWord');
- Item.Values.Add('cgQWord');
- Item.Values.Add('qword lQWord');
- Item.Values.Add('qword gQWord');
- Item.Values.Add('qword clQWord');
- Item.Values.Add('qword cgQWord');
- Item.Values.Add(' qword lRec');
- Item.Values.Add(' qword gRec');
- Item.Values.Add(' lRec.rQWord');
- Item.Values.Add(' gRec.rQWord');
- end
- else if (AnsiSameText(sl_Operand, 'MEM128')) or
- (AnsiSameText(sl_Operand, 'MEM128_M')) or
- (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM128;
- Item.OpActive := true;
- Item.Values.Add('lOWord');
- Item.Values.Add('gOWord');
- Item.Values.Add('clOWord');
- Item.Values.Add('cgOWord');
- Item.Values.Add('oword lOWord');
- Item.Values.Add('oword gOWord');
- Item.Values.Add('oword clOWord');
- Item.Values.Add('oword cgOWord');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' oword lRec');
- Item.Values.Add(' oword gRec');
- Item.Values.Add(' lRec.rByte');
- Item.Values.Add(' gRec.rByte');
- Item.Values.Add(' lRec.rWord');
- Item.Values.Add(' gRec.rWord');
- Item.Values.Add(' lRec.rDWord');
- Item.Values.Add(' gRec.rDWord');
- Item.Values.Add(' lRec.rQWord');
- Item.Values.Add(' gRec.rQWord');
- Item.Values.Add(' lRec.rOWord');
- Item.Values.Add(' gRec.rOWord');
- Item.Values.Add(' lRec.rYWord');
- Item.Values.Add(' gRec.rYWord');
- Item.Values.Add(' lRec.rZWord');
- Item.Values.Add(' gRec.rZWord');
- end
- else if (AnsiSameText(sl_Operand, 'MEM256')) or
- (AnsiSameText(sl_Operand, 'MEM256_M')) or
- (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM256;
- Item.OpActive := true;
- Item.Values.Add('lYWord');
- Item.Values.Add('gYWord');
- Item.Values.Add('clYWord');
- Item.Values.Add('cgYWord');
- Item.Values.Add('yword lYWord');
- Item.Values.Add('yword gYWord');
- Item.Values.Add('yword clYWord');
- Item.Values.Add('yword cgYWord');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' yword lRec');
- Item.Values.Add(' yword gRec');
- Item.Values.Add(' lRec.rByte');
- Item.Values.Add(' gRec.rByte');
- Item.Values.Add(' lRec.rWord');
- Item.Values.Add(' gRec.rWord');
- Item.Values.Add(' lRec.rDWord');
- Item.Values.Add(' gRec.rDWord');
- Item.Values.Add(' lRec.rQWord');
- Item.Values.Add(' gRec.rQWord');
- Item.Values.Add(' lRec.rOWord');
- Item.Values.Add(' gRec.rOWord');
- Item.Values.Add(' lRec.rYWord');
- Item.Values.Add(' gRec.rYWord');
- Item.Values.Add(' lRec.rZWord');
- Item.Values.Add(' gRec.rZWord');
- end
- else if (AnsiSameText(sl_Operand, 'MEM512')) or
- (AnsiSameText(sl_Operand, 'MEM512_M')) or
- (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM512;
- Item.OpActive := true;
- Item.Values.Add('lZWord');
- Item.Values.Add('gZWord');
- Item.Values.Add('clZWord');
- Item.Values.Add('cgZWord');
- Item.Values.Add('zword lZWord');
- Item.Values.Add('zword gZWord');
- Item.Values.Add('zword clZWord');
- Item.Values.Add('zword cgZWord');
- Item.Values.Add(' lRec');
- Item.Values.Add(' gRec');
- Item.Values.Add(' zword lRec');
- Item.Values.Add(' zword gRec');
- end
- else if AnsiSameText(sl_Operand, 'REG8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG8;
- Item.OpActive := true;
- Item.Values.Add('al');
- end
- else if AnsiSameText(sl_Operand, 'REG16') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG16;
- Item.OpActive := true;
- Item.Values.Add('ax');
- end
- else if AnsiSameText(sl_Operand, 'REG32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG32;
- Item.OpActive := true;
- Item.Values.Add('eax');
- end
- else if AnsiSameText(sl_Operand, 'REG64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG64;
- Item.OpActive := true;
- Item.Values.Add('rax');
- end
- else if AnsiSameText(sl_Operand, 'RM32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otRM32;
- Item.OpActive := true;
- Item.Values.Add('lDWord');
- Item.Values.Add('gDWord');
- end
- else if AnsiSameText(sl_Operand, 'RM64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otRM64;
- Item.OpActive := true;
- Item.Values.Add('lQWord');
- Item.Values.Add('gQWord');
- end
- else if AnsiSameText(sl_Operand, 'IMM8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otIMM8;
- Item.OpActive := true;
- Item.Values.Add('0');
- end
- else if AnsiSameText(sl_Operand, 'XMEM32') or
- AnsiSameText(sl_Operand, 'XMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMEM32;
- Item.OpActive := true;
- end
- else if AnsiSameText(sl_Operand, 'XMEM64') or
- AnsiSameText(sl_Operand, 'XMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMEM64;
- Item.OpActive := true;
- end
- else if AnsiSameText(sl_Operand, 'YMEM32') or
- AnsiSameText(sl_Operand, 'YMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMEM32;
- Item.OpActive := true;
- end
- else if AnsiSameText(sl_Operand, 'YMEM64') or
- AnsiSameText(sl_Operand, 'YMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- end
- else if AnsiSameText(sl_Operand, 'ZMEM32') or
- AnsiSameText(sl_Operand, 'ZMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- end
- else if AnsiSameText(sl_Operand, 'ZMEM64') or
- AnsiSameText(sl_Operand, 'ZMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- end
- else if AnsiSameText(sl_Operand, '2B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- Item.Values.Add('lDWord {1to2}');
- Item.Values.Add('gDWord {1to2}');
- end
- else if AnsiSameText(sl_Operand, '4B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- Item.Values.Add('lDWord {1to4}');
- Item.Values.Add('gDWord {1to4}');
- end
- else if AnsiSameText(sl_Operand, '8B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- Item.Values.Add('lDWord {1to8}');
- Item.Values.Add('gDWord {1to8}');
- end
- else if AnsiSameText(sl_Operand, '16B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- Item.Values.Add('lDWord {1to16}');
- Item.Values.Add('gDWord {1to16}');
- end
- else if AnsiSameText(sl_Operand, '2B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- Item.Values.Add('lQWord {1to2}');
- Item.Values.Add('gQWord {1to2}');
- end
- else if AnsiSameText(sl_Operand, '4B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- Item.Values.Add('lQWord {1to4}');
- Item.Values.Add('gQWord {1to4}');
- end
- else if AnsiSameText(sl_Operand, '8B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- Item.Values.Add('lQWord {1to8}');
- Item.Values.Add('gQWord {1to8}');
- end
- else if AnsiSameText(sl_Operand, '16B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- Item.Values.Add('lQWord {1to16}');
- Item.Values.Add('gQWord {1to16}');
- end
- else if AnsiSameText(sl_Operand, 'KREG') or
- AnsiSameText(sl_Operand, 'KREG_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otKREG;
- Item.OpActive := true;
- Item.Values.Add('k1');
- end
- else if trim(sl_Operand) = '' then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otUnknown;
- Item.OpActive := false;
- Item.Values.Add('');
- end
- else
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otUnknown;
- Item.OpActive := false;
- Item.Values.Add('?' + sl_Operand);
- end
- end;
- sl_RegCombi := '';
- il_Operands := 0;
- UsedParams := 0;
- if OItem1.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 1;
- end;
- if OItem2.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 2;
- end;
- if OItem3.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 4;
- end;
- if OItem4.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 8;
- end;
- case il_Operands of
- 1: UseDefault := UsedParams <> 1;
- 2: UseDefault := UsedParams <> 3;
- 3: UseDefault := UsedParams <> 7;
- 4: UseDefault := UsedParams <> 15;
- else UseDefault := true;
- end;
- //UseDefault := true;
- if UseDefault then
- begin
- sl_Inst := format('%-20s', [aInst]);
- for il_Op1 := 0 to OItem1.Values.Count - 1 do
- begin
- for il_Op2 := 0 to OItem2.Values.Count - 1 do
- begin
- for il_Op3 := 0 to OItem3.Values.Count - 1 do
- begin
- for il_Op4 := 0 to OItem4.Values.Count - 1 do
- begin
- sl_RegCombi := '';
- if OItem1.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
- end;
- if OItem2.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
- end;
- if OItem3.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
- end;
- if OItem4.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
- end;
- if sl_RegCombi <> '' then
- begin
- //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
- result.Add(sl_Inst + sl_RegCombi);
- sl_RegCombi := '';
- end;
- end;
- end;
- end;
- end;
- end
- else
- begin
- sl_Inst := format('%-20s', [aInst]);
- for il_Op1 := 0 to OItem1.Values.Count - 1 do
- begin
- if OItem1.OpActive then
- begin
- sl_RegCombi1 := OItem1.Values[il_Op1];
- end
- else sl_RegCombi1 := '';
- for il_Op2 := 0 to OItem2.Values.Count - 1 do
- begin
- if OItem2.OpActive then
- begin
- sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
- end
- else sl_RegCombi2 := sl_RegCombi1;
- for il_Op3 := 0 to OItem3.Values.Count - 1 do
- begin
- if OItem3.OpActive then
- begin
- sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
- end
- else sl_RegCombi3 := sl_RegCombi2;
- for il_Op4 := 0 to OItem4.Values.Count - 1 do
- begin
- if OItem4.OpActive then
- begin
- sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
- end
- else sl_RegCombi := sl_RegCombi3;
- if sl_RegCombi <> '' then
- begin
- //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
- result.Add(sl_Inst + sl_RegCombi);
- sl_RegCombi := '';
- end;
- end;
- end;
- end;
- end;
- end;
- finally
- FreeAndNil(OItem4);
- end;
- finally
- FreeAndNil(OItem3);
- end;
- finally
- FreeAndNil(OItem2);
- end;
- finally
- FreeAndNil(OItem1);
- end;
- end;
- function TAsmTestGenerator.InternalCalcTestDataCDISP8(const aInst, aOp1, aOp2,
- aOp3, aOp4: String): TStringList;
- var
- i: integer;
- Item: TOperandListItem;
- OItem1: TOperandListItem;
- OItem2: TOperandListItem;
- OItem3: TOperandListItem;
- OItem4: TOperandListItem;
- il_Op: integer;
- il_Op1: integer;
- il_Op2: integer;
- il_Op3: integer;
- il_Op4: integer;
- iAsmCounter: integer;
- sSuffix: string;
- sReg: string;
- sl_Operand: String;
- sl_Inst : String;
- sRegCombi: String;
- sRegCombi1: String;
- sRegCombi2: String;
- sRegCombi3: String;
- sRegCombi4: String;
- sBaseReg : String;
- sIndexReg : String;
- sl_Prefix: String;
- UsePrefix: boolean;
- il_Operands: integer;
- UsedParams: cardinal;
- UseDefault: boolean;
- sl_RegCombi1: string;
- sl_RegCombi2: string;
- sl_RegCombi3: string;
- sInstruction: string;
- sMREF: string;
- sLogMsg: string;
- MaskRegNeeded:boolean;
- slRegCombi: TStringList;
- OpMode: TOpMode;
- iOpNumMRef: integer;
- function PrepareOperandTyp(const aTyp: String): String;
- begin
- result := aTyp;
- if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
- if result = 'XMMRM128' then result := 'XMMRM';
- if result = 'YMMRM256' then result := 'YMMRM';
- end;
- procedure SplitOperands(const aOperand1, aOperand2, aOperand3, aOperand4: string; var aRegCombi0, aRegCombi1, aRegCombi2, aRegCombi3, aRegCombi4: string);
- var
- i: integer;
- s1: string;
- s2: string;
- s3: string;
- s4: string;
- iCnt1: integer;
- iCnt2: integer;
- iCnt3: integer;
- iCnt4: integer;
- iMaxCnt: integer;
- begin
- with TStringList.Create do
- try
- Text := StringReplace(trim(aOperand1), '|', #13#10, [rfReplaceAll]);
- iCnt1 := Count;
- Text := StringReplace(trim(aOperand2), '|', #13#10, [rfReplaceAll]);
- iCnt2 := Count;
- Text := StringReplace(trim(aOperand3), '|', #13#10, [rfReplaceAll]);
- iCnt3 := Count;
- Text := StringReplace(trim(aOperand4), '|', #13#10, [rfReplaceAll]);
- iCnt4 := Count;
- iMaxCnt := iCnt1;
- if iCnt2 > iMaxCnt then iMaxCnt := iCnt2;
- if iCnt3 > iMaxCnt then iMaxCnt := iCnt3;
- if iCnt4 > iMaxCnt then iMaxCnt := iCnt4;
- if (aOperand1 <> '') and (aRegCombi0 <> '') then
- begin
- aRegCombi0 := aRegCombi0 + ',';
- aRegCombi1 := aRegCombi1 + ',';
- aRegCombi2 := aRegCombi2 + ',';
- aRegCombi3 := aRegCombi3 + ',';
- aRegCombi4 := aRegCombi4 + ',';
- end;
- Text := StringReplace(trim(aOperand1), '|', #13#10, [rfReplaceAll]);
- if Count = iMaxCnt then
- begin
- for i := 0 to iMaxCnt - 1 do
- begin
- case i of
- 0: aRegCombi0 := aRegCombi0 + ',' + Strings[i];
- 1: aRegCombi1 := aRegCombi1 + ',' + Strings[i];
- 2: aRegCombi2 := aRegCombi2 + ',' + Strings[i];
- 3: aRegCombi3 := aRegCombi3 + ',' + Strings[i];
- 4: aRegCombi4 := aRegCombi4 + ',' + Strings[i];
- end;
- end;
- end
- else
- begin
- if Count = 1 then
- begin
- for i := 0 to iMaxCnt - 1 do
- begin
- case i of
- 0: aRegCombi0 := aRegCombi0 + ',' + Strings[0];
- 1: aRegCombi1 := aRegCombi1 + ',' + Strings[0];
- 2: aRegCombi2 := aRegCombi2 + ',' + Strings[0];
- 3: aRegCombi3 := aRegCombi3 + ',' + Strings[0];
- 4: aRegCombi4 := aRegCombi4 + ',' + Strings[0];
- end;
- end;
- end
- else
- begin
- // TODO log
- end;
- end;
- finally
- Free;
- end;
- end;
- function MapOperand(aOpTyp: TOpType): String;
- begin
- case aOpTyp of
- otXMMReg: result := 'X';
- otYMMReg: result := 'Y';
- otZMMReg: result := 'Z';
- otEAX,
- otRAX,
- otREG64,
- otREG32,
- otREG16,
- otREG8: result := 'R';
- otRM32,
- otRM64,
- otXMMRM,
- otXMMRM8,
- otXMMRM16,
- otYMMRM,
- otZMMRM,
- otMem32,
- otMem8,
- otMem16,
- otMem64,
- otMem128,
- otMem256,
- otMem512: result := 'M';
- otIMM8: result := 'I';
- otXMEM32: result := 'X32';
- otXMEM64: result := 'X64';
- otYMEM32: result := 'Y32';
- otYMEM64: result := 'Y64';
- otZMEM32: result := 'Z32';
- otZMEM64: result := 'Z64';
- otB32: result := 'B32';
- otB64: result := 'B64';
- otKREG: result := 'K';
- else result := '';
- end;
- end;
- function AsmCodeBlockCompare(aAsmCounter: integer; aCompareMode: TAsmCompareMode): String;
- var
- sReg: string;
- begin
- result := '';
- case Fx64 of
- true: sReg := 'RAX';
- else sReg := 'EAX';
- end;
- with TStringList.Create do
- try
- Add(format('%20s%6s ', [' push', sReg]));
- Add(format('%20s%6s,%s', [' mov', sReg, inttostr(aAsmCounter)]));
- Add(format('%20s%6s,%s', [' kmovd', 'K7', 'EAX']));
- Add(format('%20s%6s', [' pop', sReg]));
- case aComparemode of
- //cmKORTESTNC: begin
- // Add(format('%20s%6s, %s', ['ktestb', 'K2', 'K1']));
- // Add(format('%20s %6s', [' jnc', '@@CHECKRESULT']));
- // end;
- //cmXORTestNZ: begin
- // Add(format('%20s%6s, %s', ['kortestq', 'K2', 'K2']));
- // Add(format('%20s %6s', [' jnz', '@@CHECKRESULT']));
- // end;
- cmKORTESTNC: begin
- Add(format('%20s%6s, %s', ['ktestb', 'K2', 'K1']));
- Add(format('%20s%6s, %s', [' kmovq', 'R10', 'K6']));
- Add(format('%20s%6s, @@%d[RIP]', ['cmovc', 'R10', aAsmCounter]));
- Add(format('%20s %6s', [' jmp', 'R10']));
- Add(format(' @@%d%s', [aAsmCounter, ':']));
- end;
- cmXORTestNZ: begin
- Add(format('%20s%6s, %s', ['kortestq', 'K2', 'K2']));
- Add(format('%20s%6s, %s', [' kmovq', 'R10', 'K6']));
- Add(format('%20s%6s, @@%d[RIP]', ['cmovz', 'R10', aAsmCounter]));
- Add(format('%20s %6s', [' jmp', 'R10']));
- Add(format(' @@%d%s', [aAsmCounter, ':']));
- end;
- end;
- result := Text;
- finally
- Free;
- end;
- end;
- begin
- result := TStringList.Create;
- iAsmCounter := 0;
- OItem1 := TOperandListItem.Create;
- try
- OItem2 := TOperandListItem.Create;
- try
- OItem3 := TOperandListItem.Create;
- try
- OItem4 := TOperandListItem.Create;
- try
- UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
- (UpperCase(aInst) = 'VCVTPD2PS') OR
- (UpperCase(aInst) = 'VCVTSI2SD') OR
- (UpperCase(aInst) = 'VCVTSI2SS') OR
- (UpperCase(aInst) = 'VCVTTPD2DQ') or
- (UpperCase(aInst) = 'VPMOVZXWQ') or
- (UpperCase(aInst) = 'VCVTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTUQQ2PS') or
- (UpperCase(aInst) = 'VCVTQQ2PS') or
- (UpperCase(aInst) = 'VCVTUSI2SD') or
- (UpperCase(aInst) = 'VCVTUSI2SS') or
- (UpperCase(aInst) = 'VFPCLASSPD') or
- (UpperCase(aInst) = 'VFPCLASSPS') or
- (UpperCase(aInst) = 'VCMPSS')
- ;
- MaskRegNeeded := (Pos('VGATHER', Uppercase(aInst)) = 1) or
- (Pos('VPGATHER', Uppercase(aInst)) = 1) or
- (Pos('VPSCATTER', Uppercase(aInst)) = 1) or
- (Pos('VSCATTER', Uppercase(aInst)) = 1);
- for il_Op := 1 to 4 do
- begin
- sl_Prefix := '';
- case il_Op of
- 1: begin
- Item := OItem1;
- sl_Operand := aOp1;
- end;
- 2: begin
- Item := OItem2;
- sl_Operand := aOp2;
- end;
- 3: begin
- Item := OItem3;
- sl_Operand := aOp3;
- end;
- 4: begin
- Item := OItem4;
- sl_Operand := aOp4;
- end;
- end;
- sl_Operand := PrepareOperandTyp(sl_Operand);
- if (AnsiSameText(sl_Operand, 'XMMREG')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMReg;
- Item.OpActive := true;
- Item.Values.Add('XMM16');
- end
- else if (AnsiSameText(sl_Operand, 'XMMREG_M')) or
- (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMReg;
- Item.OpActive := true;
- //sSuffix := '';
- //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- //
- //if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
- // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- //
- //Item.Values.Add('XMM0' + sSuffix);
- //if (sSuffix <> '') and
- // (MaskRegNeeded = false) then Item.Values.Add('XMM0');
- Item.Values.Add('XMM16');
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM')) or
- (AnsiSameText(sl_Operand, 'XMMRM_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
- if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
- else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM8;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'byte ';
- if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
- else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM16;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'word ';
- if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
- else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'YMMREG')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMMReg;
- Item.OpActive := true;
- Item.Values.Add('YMM16');
- end
- else if (AnsiSameText(sl_Operand, 'YMMREG_M')) or
- (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMMReg;
- Item.OpActive := true;
- //sSuffix := '';
- //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- //
- //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- //
- //Item.Values.Add('YMM0' + sSuffix);
- //if (sSuffix <> '') and
- // (MaskRegNeeded = false) then Item.Values.Add('YMM0');
- Item.Values.Add('YMM16');
- end
- else if (AnsiSameText(sl_Operand, 'YMMRM')) or
- (AnsiSameText(sl_Operand, 'YMMRM_M')) or
- (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- //sSuffix := '';
- //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- //
- //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
- else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'ZMMREG')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMMReg;
- Item.OpActive := true;
- Item.Values.Add('ZMM16');
- end
- else if (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMMReg;
- Item.OpActive := true;
- //sSuffix := '';
- //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- //
- //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('ZMM16');
- end
- else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- //sSuffix := '';
- //if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- // else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- //
- //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
- else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'MEM8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM8;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'byte ';
- sSuffix := '';
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'MEM16') or
- AnsiSameText(sl_Operand, 'MEM16_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM16;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'word ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'MEM32') or
- AnsiSameText(sl_Operand, 'MEM32_M') or
- AnsiSameText(sl_Operand, 'MEM32_MZ') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'dword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM64')) or
- (AnsiSameText(sl_Operand, 'MEM64_M')) or
- (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'qword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM128')) or
- (AnsiSameText(sl_Operand, 'MEM128_M')) or
- (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM128;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM256')) or
- (AnsiSameText(sl_Operand, 'MEM256_M')) or
- (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM256;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM512')) or
- (AnsiSameText(sl_Operand, 'MEM512_M')) or
- (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM512;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'REG8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG8;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg8);
- end
- else Item.Values.AddStrings(FReg8);
- end
- else if AnsiSameText(sl_Operand, 'REG16') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG16;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg16);
- end
- else Item.Values.AddStrings(FReg16);
- end
- else if AnsiSameText(sl_Operand, 'REG32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG32;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg32Base);
- end
- else Item.Values.AddStrings(FReg32Base);
- end
- else if AnsiSameText(sl_Operand, 'REG64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG64;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg64Base);
- end;
- end
- else if AnsiSameText(sl_Operand, 'RM32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otRM32;
- Item.OpActive := true;
- Item.Values.AddStrings(FReg32Base);
- if UsePrefix then sl_Prefix := 'dword ';
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'RM64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otRM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'qword ';
- if x64 then
- begin
- Item.Values.AddStrings(FReg64Base);
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'IMM8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otIMM8;
- Item.OpActive := true;
- Item.Values.Add('0');
- end
- else if AnsiSameText(sl_Operand, 'XMEM32') or
- AnsiSameText(sl_Operand, 'XMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false) then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'XMEM64') or
- AnsiSameText(sl_Operand, 'XMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMEM64;
- Item.OpActive := true;
- //if UsePrefix then sl_Prefix := 'oword ';
- //
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'YMEM32') or
- AnsiSameText(sl_Operand, 'YMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'YMEM64') or
- AnsiSameText(sl_Operand, 'YMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'ZMEM32') or
- AnsiSameText(sl_Operand, 'ZMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'ZMEM64') or
- AnsiSameText(sl_Operand, 'ZMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
- if (sSuffix <> '') and
- (MaskRegNeeded = false)
- then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, '2B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '4B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '8B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '16B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '2B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '4B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '8B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '16B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'KREG') or
- AnsiSameText(sl_Operand, 'KREG_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otKREG;
- Item.OpActive := true;
- Item.Values.Add('K1');
- end
- else if trim(sl_Operand) = '' then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otUnknown;
- Item.OpActive := false;
- Item.Values.Add('');
- end
- else
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otUnknown;
- Item.OpActive := false;
- Item.Values.Add('?' + sl_Operand);
- end
- end;
- //sl_RegCombi := '';
- il_Operands := 0;
- UsedParams := 0;
- if OItem1.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 1;
- end;
- if OItem2.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 2;
- end;
- if OItem3.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 4;
- end;
- if OItem4.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 8;
- end;
- case il_Operands of
- 1: UseDefault := UsedParams <> 1;
- 2: UseDefault := UsedParams <> 3;
- 3: UseDefault := UsedParams <> 7;
- 4: UseDefault := UsedParams <> 15;
- else UseDefault := true;
- end;
- // TODO deaktivieren
- //UseDefault := true;
- if UseDefault then
- begin
- sl_Inst := format('%-20s', [aInst]);
- for il_Op1 := 0 to OItem1.Values.Count - 1 do
- begin
- for il_Op2 := 0 to OItem2.Values.Count - 1 do
- begin
- for il_Op3 := 0 to OItem3.Values.Count - 1 do
- begin
- for il_Op4 := 0 to OItem4.Values.Count - 1 do
- begin
- slRegCombi := TStringList.Create;
- try
- while slRegCombi.Count < 5 do
- slRegCombi.Add('');
- //SplitOperands(OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]
- if OItem1.OpActive then
- begin
- // SplitOperand(OItem1.Values[il_Op1], sRegCombi0,sRegCombi1,sRegCombi2,sRegCombi3,sRegCombi4);
- //
- end;
- finally
- FreeAndNil(slRegCombi);
- end;
- //sRegCombi0 := '';
- //sRegCombi1 := '';
- //sRegCombi2 := '';
- //sRegCombi3 := '';
- //sRegCombi4 := '';
- //
- //if OItem1.OpActive then
- //begin
- // if sRegCombi0 <> '' then
- // begin
- // sRegCombi0 := sRegCombi0 + ', ';
- // sRegCombi1 := sRegCombi1 + ', ';
- // sRegCombi2 := sRegCombi2 + ', ';
- // sRegCombi3 := sRegCombi3 + ', ';
- // sRegCombi4 := sRegCombi4 + ', ';
- // end;
- //
- // if Pos('|', OItem1.Values[il_Op1]) > 0 then
- // begin
- // with TStringList.Create do
- // try
- // Text := Stringreplace(OItem1.Values[il_Op1], '|', #13#10,[rfReplaceAll]);
- // iCnt := Count;
- // while Count < 5 do Add('');
- //
- // sRegCombi0 := sRegCombi0 + Strings[0];
- // sRegCombi1 := sRegCombi1 + Strings[1];
- // sRegCombi2 := sRegCombi2 + Strings[2];
- // sRegCombi3 := sRegCombi3 + Strings[3];
- // sRegCombi4 := sRegCombi4 + Strings[4];
- //
- // finally
- // Free;
- // end;
- // end
- // else
- // begin
- // sRegCombi0 := sRegCombi0 + OItem1.Values[il_Op1];
- // sRegCombi1 := sRegCombi1 + OItem1.Values[il_Op1];
- // sRegCombi2 := sRegCombi2 + OItem1.Values[il_Op1];
- // sRegCombi3 := sRegCombi3 + OItem1.Values[il_Op1];
- // sRegCombi4 := sRegCombi4 + OItem1.Values[il_Op1];
- // end;
- //end;
- //
- //if OItem2.OpActive then
- //begin
- // if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- // sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
- //end;
- //
- //if OItem3.OpActive then
- //begin
- // if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- // sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
- //end;
- //
- //if OItem4.OpActive then
- //begin
- // if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- // sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
- //end;
- //
- //if sl_RegCombi <> '' then
- //begin
- // //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
- // result.Add(sl_Inst + sl_RegCombi);
- // sl_RegCombi := '';
- //end;
- end;
- end;
- end;
- end;
- end
- else
- begin
- OpMode := omUnknown;
- iOpNumMRef := -1;
- if (OItem1.OpTyp in MEMTYPES) or
- (OItem1.OpTyp in BMEMTYPES) then iOpNumMRef := 1
- else if (OItem2.OpTyp in MEMTYPES) or
- (OItem2.OpTyp in BMEMTYPES) then iOpNumMRef := 2
- else if (OItem3.OpTyp in MEMTYPES) or
- (OItem3.OpTyp in BMEMTYPES) then iOpNumMRef := 3
- else if (OItem4.OpTyp in MEMTYPES) or
- (OItem4.OpTyp in BMEMTYPES) then iOpNumMRef := 4;
- // TODO delete
- //if il_Operands = 4 then
- case il_Operands of
- 2: begin
- if (OItem1.OpTyp in MEMTYPES) and
- (OItem2.OpTyp = otXMMReg) then OpMode := omMX
- else if (OItem1.OpTyp in MEMTYPES) and
- (OItem2.OpTyp = otYMMReg) then OpMode := omMY
- else if (OItem1.OpTyp in MEMTYPES) and
- (OItem2.OpTyp = otZMMReg) then OpMode := omMZ
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otB32) then OpMode := omXB32
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otB64) then OpMode := omXB64
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otB32) then OpMode := omYB32
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otB64) then OpMode := omYB64
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otB32) then OpMode := omZB32
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otB64) then OpMode := omZB64
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp in MEMTYPES) then OpMode := omXM
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp in MEMTYPES) then OpMode := omYM
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp in MEMTYPES) then OpMode := omZM
- else
- begin
- sLogMsg := '';
- sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
- if sLogMsg <> '' then
- begin
- if (sLogMsg <> 'KX') and
- (sLogMsg <> 'KY') and
- (sLogMsg <> 'KZ') and
- (sLogMsg <> 'RM') and
- (sLogMsg <> 'RX') and
- (sLogMsg <> 'XK') and
- (sLogMsg <> 'XR') and
- (sLogMsg <> 'XX') and
- (sLogMsg <> 'XY') and
- (sLogMsg <> 'XZ') and
- (sLogMsg <> 'YK') and
- (sLogMsg <> 'YR') and
- (sLogMsg <> 'YX') and
- (sLogMsg <> 'YY') and
- (sLogMsg <> 'YZ') and
- (sLogMsg <> 'ZK') and
- (sLogMsg <> 'ZR') and
- (sLogMsg <> 'ZX') and
- (sLogMsg <> 'ZY') and
- (sLogMsg <> 'ZZ') then
- writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
- end;
- end;
- end;
- 3: if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp in MEMTYPES) then OpMode := omKXM
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp in MEMTYPES) then OpMode := omKYM
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp in MEMTYPES) then OpMode := omKZM
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp = otB32) then OpMode := omKXB32
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp = otB64) then OpMode := omKXB64
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp = otB32) then OpMode := omKYB32
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp = otB64) then OpMode := omKYB64
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp = otB32) then OpMode := omKZB32
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp = otB64) then OpMode := omKZB64
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp in MEMTYPES) and
- (OItem3.OpTyp = otIMM8) then OpMode := omKMI
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otB32) and
- (OItem3.OpTyp = otIMM8) then OpMode := omKB32I
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otB64) and
- (OItem3.OpTyp = otIMM8) then OpMode := omKB64I
- else if (OItem1.OpTyp in MEMTYPES) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp = otIMM8) then OpMode := omMXI
- else if (OItem1.OpTyp in MEMTYPES) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp = otIMM8) then OpMode := omMYI
- else if (OItem1.OpTyp in MEMTYPES) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp = otIMM8) then OpMode := omMZI
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp in MEMTYPES) then OpMode := omXXM
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp = otB32) then OpMode := omXXB32
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp = otB64) then OpMode := omXXB64
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otB32) and
- (OItem3.OpTyp = otIMM8) then OpMode := omXB32I
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otB64) and
- (OItem3.OpTyp = otIMM8) then OpMode := omXB64I
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp in MEMTYPES) and
- (OItem3.OpTyp = otIMM8) then OpMode := omXMI
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp in MEMTYPES) then OpMode := omYYM
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp = otB32) then OpMode := omYYB32
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp = otB64) then OpMode := omYYB64
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otB32) and
- (OItem3.OpTyp = otIMM8) then OpMode := omYB32I
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otB64) and
- (OItem3.OpTyp = otIMM8) then OpMode := omYB64I
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp in MEMTYPES) and
- (OItem3.OpTyp = otIMM8) then OpMode := omYMI
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp in MEMTYPES) then OpMode := omZZM
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp = otB32) then OpMode := omZZB32
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp = otB64) then OpMode := omZZB64
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otB32) and
- (OItem3.OpTyp = otIMM8) then OpMode := omZB32I
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otB64) and
- (OItem3.OpTyp = otIMM8) then OpMode := omZB64I
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp in MEMTYPES) and
- (OItem3.OpTyp = otIMM8) then OpMode := omZMI
- else
- begin
- sLogMsg := '';
- sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
- if sLogMsg <> '' then
- begin
- if (sLogMsg <> 'RMI') and
- (sLogMsg <> 'RRM') and
- (sLogMsg <> 'RMR') and
- (sLogMsg <> 'KKK') and
- (sLogMsg <> 'KKI') and
- (sLogMsg <> 'XXX') and
- (sLogMsg <> 'YYY') and
- (sLogMsg <> 'ZZZ') and
- (sLogMsg <> 'XXI') and
- (sLogMsg <> 'YYI') and
- (sLogMsg <> 'ZZI') and
- (sLogMsg <> 'XYI') and
- (sLogMsg <> 'YZI') and
- (sLogMsg <> 'XZI') and
- (sLogMsg <> 'RXI') and
- (sLogMsg <> 'RYI') and
- (sLogMsg <> 'RZI') and
- (sLogMsg <> 'XXR') then
- writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
- end;
- end;
- 4: if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp = otB32) and
- (OItem4.OpTyp = otIMM8) then OpMode := omKXB32I
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp = otB64) and
- (OItem4.OpTyp = otIMM8) then OpMode := omKXB64I
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp in MEMTYPES) and
- (OItem4.OpTyp = otIMM8) then OpMode := omKXMI
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp = otB32) and
- (OItem4.OpTyp = otIMM8) then OpMode := omKYB32I
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp = otB64) and
- (OItem4.OpTyp = otIMM8) then OpMode := omKYB64I
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp in MEMTYPES) and
- (OItem4.OpTyp = otIMM8) then OpMode := omKYMI
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp = otB32) and
- (OItem4.OpTyp = otIMM8) then OpMode := omKZB32I
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp = otB64) and
- (OItem4.OpTyp = otIMM8) then OpMode := omKZB64I
- else if (OItem1.OpTyp = otKReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp in MEMTYPES) and
- (OItem4.OpTyp = otIMM8) then OpMode := omKZMI
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp = otB32) and
- (OItem4.OpTyp = otIMM8) then OpMode := omXXB32I
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp = otB64) and
- (OItem4.OpTyp = otIMM8) then OpMode := omXXB64I
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp = otB32) and
- (OItem4.OpTyp = otIMM8) then OpMode := omYYB32I
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp = otB64) and
- (OItem4.OpTyp = otIMM8) then OpMode := omYYB64I
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp = otB32) and
- (OItem4.OpTyp = otIMM8) then OpMode := omZZB32I
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp = otB64) and
- (OItem4.OpTyp = otIMM8) then OpMode := omZZB64I
- else if (OItem1.OpTyp = otXMMReg) and
- (OItem2.OpTyp = otXMMReg) and
- (OItem3.OpTyp in MEMTYPES) and
- (OItem4.OpTyp = otIMM8) then OpMode := omXXMI
- else if (OItem1.OpTyp = otYMMReg) and
- (OItem2.OpTyp = otYMMReg) and
- (OItem3.OpTyp in MEMTYPES) and
- (OItem4.OpTyp = otIMM8) then OpMode := omYYMI
- else if (OItem1.OpTyp = otZMMReg) and
- (OItem2.OpTyp = otZMMReg) and
- (OItem3.OpTyp in MEMTYPES) and
- (OItem4.OpTyp = otIMM8) then OpMode := omZZMI
- else
- begin
- sLogMsg := '';
- sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp) + MapOperand(OItem4.Optyp);
- if sLogMsg <> '' then
- begin
- if (sLogMsg <> 'KXXI') and
- (sLogMsg <> 'KYYI') and
- (sLogMsg <> 'KZZI') and
- (sLogMsg <> 'XXRI') and
- (sLogMsg <> 'XXXI') and
- (sLogMsg <> 'YYYI') and
- (sLogMsg <> 'ZZZI') then
- writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
- end;
- end;
- else;
- end;
- if OpMode <> omUnknown then
- begin
- sInstruction := format('%20s', [aInst]);
- for il_Op1 := 0 to OItem1.Values.Count - 1 do
- begin
- for il_Op2 := 0 to OItem2.Values.Count - 1 do
- begin
- for il_Op3 := 0 to OItem3.Values.Count - 1 do
- begin
- for il_Op4 := 0 to OItem4.Values.Count - 1 do
- begin
- sRegCombi := '';
- if OItem1.OpActive then
- begin
- if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
- sRegCombi := sRegCombi + OItem1.Values[il_Op1];
- end;
- if OItem2.OpActive then
- begin
- if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
- sRegCombi := sRegCombi + OItem2.Values[il_Op2];
- end;
- if OItem3.OpActive then
- begin
- if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
- sRegCombi := sRegCombi + OItem3.Values[il_Op3];
- end;
- if OItem4.OpActive then
- begin
- if sRegCombi <> '' then sRegCombi := sRegCombi + ', ';
- sRegCombi := sRegCombi + OItem4.Values[il_Op4];
- end;
- if sRegCombi <> '' then
- begin
- case iOpNumMRef of
- 1: sMRef := OItem1.Values[il_Op1];
- 2: sMRef := OItem2.Values[il_Op2];
- 3: sMRef := OItem3.Values[il_Op3];
- 4: sMRef := OItem1.Values[il_Op4];
- else sMRef := '';
- end;
- if ParseBaseIndexReg(sMRef, sBaseReg, sIndexReg) then
- begin
- result.Add(format('%20s %s', [' pop', sBaseReg]));
- result.Add(format('%20s %s', [' push', sBaseReg]));
- if trim(sIndexReg) <> '' then
- result.Add(format('%20s%6s, %s', [' xor', sIndexReg, sIndexReg]));
- if OpMode in [omMXI, omMYI, omMZI] then
- begin
- case Fx64 of
- true: begin
- result.Add(format('%20s %6s', ['push', 'RDI']));
- result.Add(format('%20s %6s', ['push', 'RCX']));
- result.Add(format('%20s %6s', ['push', 'RAX']));
- result.Add(format('%20s %6s', ['push', sBaseReg]));
- result.Add(format('%20s %6s', ['pop', 'RDI']));
- result.Add(format('%20s %6s', ['mov', 'RCX, sizeof(DataBlock)']));
- result.Add(format('%20s %6s, %s', ['xor', 'RAX', 'RAX']));
- result.Add(format('%20s ', ['rep stosb']));
- result.Add(format('%20s %6s', ['pop', 'RAX']));
- result.Add(format('%20s %6s', ['pop', 'RCX']));
- result.Add(format('%20s %6s', ['pop', 'RDI']));
- end;
- else begin
- result.Add(format('%20s %6s', ['push', 'EDI']));
- result.Add(format('%20s %6s', ['push', 'ECX']));
- result.Add(format('%20s %6s', ['push', 'EAX']));
- result.Add(format('%20s %6s', ['push', sBaseReg]));
- result.Add(format('%20s %6s', ['pop', 'EDI']));
- result.Add(format('%20s %6s', ['mov', 'ECX, sizeof(DataBlock)']));
- result.Add(format('%20s %6s, %s', ['xor', 'EAX', 'EAX']));
- result.Add(format('%20s ', ['rep stosb']));
- result.Add(format('%20s %6s', ['pop', 'EAX']));
- result.Add(format('%20s %6s', ['pop', 'ECX']));
- result.Add(format('%20s %6s', ['pop', 'EDI']));
- end;
- end;
- end;
- end;
- //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
- result.Add(format('%-20s %6s', [sInstruction, sRegCombi]));
- inc(iAsmCounter);
- case OpMode of
- omKXM,
- omKYM,
- omKZM: begin
- result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
- result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
- end;
- omKXB32,
- omKXB64,
- omKYB32,
- omKYB64,
- omKZB32,
- omKZB64: begin
- sMREF := OItem3.Values[il_Op3];
- //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
- // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
- // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
- result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'K2', OItem2.Values[il_Op2], sMREF]));
- result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
- end;
- omKMI: begin
- result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
- result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
- end;
- omKB32I,
- omKB64I:
- begin
- result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
- result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
- end;
- omMX: begin
- result.Add(format('%20s %6s + $2000, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2]]));
- result.Add(format('%20s %6s, %s', ['vmovdqu', 'xmm0', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'xmm1', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', 'XMM0', 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omMXI: begin
- result.Add(format('%20s %6s + $2000, %6s, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
- result.Add(format('%20s %6s, %s', ['vmovdqu', 'xmm0', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'xmm1', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', 'XMM0', 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omMY: begin
- result.Add(format('%20s %6s + $2000, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2]]));
- result.Add(format('%20s %6s, %s', ['vmovdqu', 'ymm0', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'ymm1', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqd', 'K2', 'YMM0', 'YMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omMYI: begin
- result.Add(format('%20s %6s + $2000, %6s, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
- result.Add(format('%20s %6s, %s', ['vmovdqu', 'ymm0', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %s + $2000', ['vmovdqu', 'ymm1', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqd', 'K2', 'YMM0', 'YMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omMZ: begin
- result.Add(format('%20s %6s + $2000, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2]]));
- result.Add(format('%20s %6s, %s', ['vmovdqu8', 'zmm0', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %s + $2000', ['vmovdqu8', 'zmm1', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqq', 'K2', 'ZMM0', 'ZMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omMZI: begin
- result.Add(format('%20s %6s + $2000, %6s, %s', [aInst, OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
- result.Add(format('%20s %6s, %s', ['vmovdqu8', 'zmm0', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %s + $2000', ['vmovdqu8', 'zmm1', OItem1.Values[il_Op1]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqq', 'K2', 'ZMM0', 'ZMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omXB32,
- omXB64: begin
- sMREF := OItem2.Values[il_Op2];
- result.Add(format('%20s%6s,%6s + $2000', [aInst, 'XMM1', sMREF]));
- result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omXB32I,
- omXB64I: begin
- sMREF := OItem2.Values[il_Op2];
- //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
- // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
- // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
- result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
- result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omXM: begin
- result.Add(format('%20s %6s, %s + $2000', [aInst, 'XMM1', OItem2.Values[il_Op2] ]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omXXM: begin
- result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3] ]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omXXB32,
- omXXB64: begin
- sMREF := OItem3.Values[il_Op3];
- //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
- // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
- // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
- result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', sMREF]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omXMI: begin
- result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omYB32,
- omYB64: begin
- sMREF := OItem2.Values[il_Op2];
- result.Add(format('%20s%6s,%6s + $2000', [aInst, 'YMM1', sMREF]));
- result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omYB32I,
- omYB64I:
- begin
- sMREF := OItem2.Values[il_Op2];
- //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
- // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
- // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
- //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
- //
- //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
- //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
- //result.Add('');
- result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'YMM1', sMREF, OItem3.Values[il_Op3]]));
- result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omYM: begin
- result.Add(format('%20s %6s, %s + $2000', [aInst, 'YMM1', OItem2.Values[il_Op2] ]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omYYM: begin
- //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', OItem3.Values[il_Op3]]));
- //
- //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
- //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
- //result.Add('');
- result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', OItem3.Values[il_Op3] ]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omYYB32,
- omYYB64: begin
- sMREF := OItem3.Values[il_Op3];
- //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
- // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
- // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
- //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
- //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
- //
- //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
- //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
- //result.Add('');
- result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', sMREF]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omYMI: begin
- //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
- //
- //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
- //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
- //result.Add('');
- result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'YMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omZB32,
- omZB64: begin
- sMREF := OItem2.Values[il_Op2];
- result.Add(format('%20s%6s,%6s + $2000', [aInst, 'ZMM1', sMREF]));
- result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omZB32I,
- omZB64I:
- begin
- sMREF := OItem2.Values[il_Op2];
- //if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
- // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
- //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s + $20, %s', [aInst, 'XMM3', sMREF, OItem3.Values[il_Op3]]));
- //
- //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
- //result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
- //result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
- //
- //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
- //result.Add('');
- result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'ZMM1', sMREF, OItem3.Values[il_Op3]]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omZM: begin
- result.Add(format('%20s %6s, %s + $2000', [aInst, 'ZMM1', OItem2.Values[il_Op2] ]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omZZM: begin
- //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s, %s + $20', [aInst, 'XMM3', 'XMM3', OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s, %s + $30', [aInst, 'XMM4', 'XMM4', OItem3.Values[il_Op3]]));
- //
- //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
- //result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
- //result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
- //
- //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
- //result.Add('');
- result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', OItem3.Values[il_Op3] ]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omZZB32,
- omZZB64: begin
- sMREF := OItem3.Values[il_Op3];
- //if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
- // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
- //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
- //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
- //result.Add(format('%20s%6s,%6s, %s + $20', [aInst, 'XMM3', 'XMM3', sMREF]));
- //result.Add(format('%20s%6s,%6s, %s + $30', [aInst, 'XMM4', 'XMM4', sMREF]));
- //
- //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
- //result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
- //result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
- //
- //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
- //result.Add('');
- result.Add(format('%20s %6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', sMREF]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omZMI: begin
- //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s + $20, %s', [aInst, 'XMM3', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
- //result.Add(format('%20s%6s,%6s + $30, %s', [aInst, 'XMM4', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
- //
- //result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
- //result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
- //result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
- //
- //result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- //result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
- //result.Add('');
- result.Add(format('%20s %6s,%6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
- result.Add(format('%20s %6s,%6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omKXB32I,
- omKXB64I:
- begin
- result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
- result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
- end;
- omKXMI:
- begin
- result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
- result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
- end;
- omKYB32I,
- omKYB64I:
- begin
- result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
- result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
- end;
- omKYMI:
- begin
- result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
- result.Add(format('%20s %6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
- end;
- omXXB32I,
- omXXB64I:
- begin
- sMREF := OItem3.Values[il_Op3];
- result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omXXMI:
- begin
- sMREF := OItem3.Values[il_Op3];
- result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omYYB32I,
- omYYB64I,
- omYYMI:
- begin
- sMREF := OItem3.Values[il_Op3];
- result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'YMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- omKZB32I,
- omKZB64I,
- omKZMI:
- begin
- result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4]]));
- result.Add(format('%20s %6s, %6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
- end;
- //omKZMI:
- // begin
- // sMREF := OItem3.Values[il_Op3];
- //
- // result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
- // result.Add(format('%20s %6s, %6s, %6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- //
- // result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- // end;
- omZZB32I,
- omZZB64I,
- omZZMI:
- begin
- sMREF := OItem3.Values[il_Op3];
- result.Add(format('%20s %6s, %6s, %6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], sMREF, OItem4.Values[il_Op4]]));
- result.Add(format('%20s %6s, %6s, %s', ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
- result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
- end;
- else begin
- sLogMsg := '';
- sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
- writeln('offen - : ' + sLogMsg + ' (' + aInst + ')');
- end;
- end;
- sRegCombi := '';
- end;
- end;
- end;
- end;
- end;
- end;
- //sl_Inst := format('%-20s', [aInst]);
- //
- //for il_Op1 := 0 to OItem1.Values.Count - 1 do
- //begin
- // if OItem1.OpActive then
- // begin
- // sl_RegCombi1 := OItem1.Values[il_Op1];
- // end
- // else sl_RegCombi1 := '';
- //
- // for il_Op2 := 0 to OItem2.Values.Count - 1 do
- // begin
- // if OItem2.OpActive then
- // begin
- // sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
- // end
- // else sl_RegCombi2 := sl_RegCombi1;
- //
- // for il_Op3 := 0 to OItem3.Values.Count - 1 do
- // begin
- // if OItem3.OpActive then
- // begin
- // sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
- // end
- // else sl_RegCombi3 := sl_RegCombi2;
- //
- // for il_Op4 := 0 to OItem4.Values.Count - 1 do
- // begin
- // if OItem4.OpActive then
- // begin
- // sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
- // end
- // else sl_RegCombi := sl_RegCombi3;
- //
- // if (sl_RegCombi <> '') and
- // (
- // (OItem1.OpActive and (OItem1.OpTyp in OTMEMTYPES)) or
- // (OItem2.OpActive and (OItem2.OpTyp in OTMEMTYPES)) or
- // (OItem3.OpActive and (OItem3.OpTyp in OTMEMTYPES)) or
- // (OItem4.OpActive and (OItem4.OpTyp in OTMEMTYPES))
- // ) then
- // begin
- // //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
- // result.Add(sl_Inst + sl_RegCombi);
- //
- //
- //
- // sl_RegCombi := '';
- // end;
- // end;
- // end;
- // end;
- //end;
- end;
- finally
- FreeAndNil(OItem4);
- end;
- finally
- FreeAndNil(OItem3);
- end;
- finally
- FreeAndNil(OItem2);
- end;
- finally
- FreeAndNil(OItem1);
- end;
- end;
- constructor TAsmTestGenerator.Create;
- begin
- inherited;
- FX64 := true;
- FAVX512 := false;
- FReg8 := TStringList.Create;
- FReg16 := TStringList.Create;
- FReg32Base := TStringList.Create;
- FReg32Index := TStringList.Create;
- FReg64Base := TStringList.Create;
- FReg64Index := TStringList.Create;
- FReg6432Base := TStringList.Create;
- FReg6432Index := TStringList.Create;
- FReg32XMMIndex := TStringList.Create;
- FReg32YMMIndex := TStringList.Create;
- FReg32ZMMIndex := TStringList.Create;
- FReg64XMMIndex := TStringList.Create;
- FReg64YMMIndex := TStringList.Create;
- FReg64ZMMIndex := TStringList.Create;
- FRegKREG := TStringList.Create;
- FReg8.Add('AL');
- FReg8.Add('BL');
- FReg8.Add('CL');
- FReg8.Add('DL');
-
- FReg16.Add('AX');
- FReg16.Add('BX');
- FReg16.Add('CX');
- FReg16.Add('DX');
- FReg32Base.Add('EAX');
- FReg32Base.Add('EBX');
- FReg32Base.Add('ECX');
- FReg32Base.Add('EDX');
- //FReg32Base.Add('ESP');
- //FReg32Base.Add('EBP');
- FReg32Base.Add('EDI');
- FReg32Base.Add('ESI');
- FReg32Index.Add('EAX');
- FReg32Index.Add('EBX');
- FReg32Index.Add('ECX');
- FReg32Index.Add('EDX');
- //FReg32Index.Add('EBP');
- FReg32Index.Add('EDI');
- FReg32Index.Add('ESI');
- FReg64Base.Add('RAX');
- FReg64Base.Add('RBX');
- FReg64Base.Add('RCX');
- FReg64Base.Add('RDX');
- //FReg64Base.Add('RSP');
- //FReg64Base.Add('RBP');
- FReg64Base.Add('RDI');
- FReg64Base.Add('RSI');
- FReg64Base.Add('R8');
- FReg64Base.Add('R9');
- FReg64Base.Add('R10');
- FReg64Base.Add('R11');
- FReg64Base.Add('R12');
- FReg64Base.Add('R13');
- FReg64Base.Add('R14');
- FReg64Base.Add('R15');
- FReg64Index.Add('RAX');
- FReg64Index.Add('RBX');
- FReg64Index.Add('RCX');
- FReg64Index.Add('RDX');
- //FReg64Index.Add('RBP');
- FReg64Index.Add('RDI');
- FReg64Index.Add('RSI');
- FReg64Index.Add('R8');
- FReg64Index.Add('R9');
- FReg64Index.Add('R10');
- FReg64Index.Add('R11');
- FReg64Index.Add('R12');
- FReg64Index.Add('R13');
- FReg64Index.Add('R14');
- FReg64Index.Add('R15');
- FReg6432Base.Add('EAX');
- FReg6432Base.Add('EBX');
- FReg6432Base.Add('ECX');
- FReg6432Base.Add('EDX');
- FReg6432Base.Add('ESP');
- //FReg6432Base.Add('EBP');
- FReg6432Base.Add('EDI');
- FReg6432Base.Add('ESI');
- FReg6432Base.Add('R8D');
- FReg6432Base.Add('R9D');
- FReg6432Base.Add('R10D');
- FReg6432Base.Add('R11D');
- FReg6432Base.Add('R12D');
- FReg6432Base.Add('R13D');
- FReg6432Base.Add('R14D');
- FReg6432Base.Add('R15D');
- FReg6432Index.Add('EAX');
- FReg6432Index.Add('EBX');
- FReg6432Index.Add('ECX');
- FReg6432Index.Add('EDX');
- //FReg6432Index.Add('EBP');
- FReg6432Index.Add('EDI');
- FReg6432Index.Add('ESI');
- FReg6432Index.Add('R8D');
- FReg6432Index.Add('R9D');
- FReg6432Index.Add('R10D');
- FReg6432Index.Add('R11D');
- FReg6432Index.Add('R12D');
- FReg6432Index.Add('R13D');
- FReg6432Index.Add('R14D');
- FReg6432Index.Add('R15D');
- FReg32XMMIndex.ADD('XMM0');
- FReg32XMMIndex.ADD('XMM1');
- FReg32XMMIndex.ADD('XMM2');
- FReg32XMMIndex.ADD('XMM3');
- FReg32XMMIndex.ADD('XMM4');
- FReg32XMMIndex.ADD('XMM5');
- FReg32XMMIndex.ADD('XMM6');
- FReg32XMMIndex.ADD('XMM7');
- FReg32YMMIndex.ADD('YMM0');
- FReg32YMMIndex.ADD('YMM1');
- FReg32YMMIndex.ADD('YMM2');
- FReg32YMMIndex.ADD('YMM3');
- FReg32YMMIndex.ADD('YMM4');
- FReg32YMMIndex.ADD('YMM5');
- FReg32YMMIndex.ADD('YMM6');
- FReg32YMMIndex.ADD('YMM7');
- FReg32ZMMIndex.ADD('ZMM0');
- FReg32ZMMIndex.ADD('ZMM1');
- FReg32ZMMIndex.ADD('ZMM2');
- FReg32ZMMIndex.ADD('ZMM3');
- FReg32ZMMIndex.ADD('ZMM4');
- FReg32ZMMIndex.ADD('ZMM5');
- FReg32ZMMIndex.ADD('ZMM6');
- FReg32ZMMIndex.ADD('ZMM7');
- FReg64XMMIndex.ADD('XMM0');
- FReg64XMMIndex.ADD('XMM1');
- FReg64XMMIndex.ADD('XMM2');
- FReg64XMMIndex.ADD('XMM3');
- FReg64XMMIndex.ADD('XMM4');
- FReg64XMMIndex.ADD('XMM5');
- FReg64XMMIndex.ADD('XMM6');
- FReg64XMMIndex.ADD('XMM7');
- FReg64XMMIndex.ADD('XMM8');
- FReg64XMMIndex.ADD('XMM9');
- FReg64XMMIndex.ADD('XMM10');
- FReg64XMMIndex.ADD('XMM11');
- FReg64XMMIndex.ADD('XMM12');
- FReg64XMMIndex.ADD('XMM13');
- FReg64XMMIndex.ADD('XMM14');
- FReg64XMMIndex.ADD('XMM15');
- FReg64YMMIndex.ADD('YMM0');
- FReg64YMMIndex.ADD('YMM1');
- FReg64YMMIndex.ADD('YMM2');
- FReg64YMMIndex.ADD('YMM3');
- FReg64YMMIndex.ADD('YMM4');
- FReg64YMMIndex.ADD('YMM5');
- FReg64YMMIndex.ADD('YMM6');
- FReg64YMMIndex.ADD('YMM7');
- FReg64YMMIndex.ADD('YMM8');
- FReg64YMMIndex.ADD('YMM9');
- FReg64YMMIndex.ADD('YMM10');
- FReg64YMMIndex.ADD('YMM11');
- FReg64YMMIndex.ADD('YMM12');
- FReg64YMMIndex.ADD('YMM13');
- FReg64YMMIndex.ADD('YMM14');
- FReg64YMMIndex.ADD('YMM15');
- FReg64ZMMIndex.ADD('ZMM0');
- FReg64ZMMIndex.ADD('ZMM1');
- FReg64ZMMIndex.ADD('ZMM2');
- FReg64ZMMIndex.ADD('ZMM3');
- FReg64ZMMIndex.ADD('ZMM4');
- FReg64ZMMIndex.ADD('ZMM5');
- FReg64ZMMIndex.ADD('ZMM6');
- FReg64ZMMIndex.ADD('ZMM7');
- FReg64ZMMIndex.ADD('ZMM8');
- FReg64ZMMIndex.ADD('ZMM9');
- FReg64ZMMIndex.ADD('ZMM10');
- FReg64ZMMIndex.ADD('ZMM11');
- FReg64ZMMIndex.ADD('ZMM12');
- FReg64ZMMIndex.ADD('ZMM13');
- FReg64ZMMIndex.ADD('ZMM14');
- FReg64ZMMIndex.ADD('ZMM15');
- FReg64ZMMIndex.ADD('ZMM16');
- FReg64ZMMIndex.ADD('ZMM17');
- FReg64ZMMIndex.ADD('ZMM18');
- FReg64ZMMIndex.ADD('ZMM19');
- FReg64ZMMIndex.ADD('ZMM20');
- FReg64ZMMIndex.ADD('ZMM21');
- FReg64ZMMIndex.ADD('ZMM22');
- FReg64ZMMIndex.ADD('ZMM23');
- FReg64ZMMIndex.ADD('ZMM24');
- FReg64ZMMIndex.ADD('ZMM25');
- FReg64ZMMIndex.ADD('ZMM26');
- FReg64ZMMIndex.ADD('ZMM27');
- FReg64ZMMIndex.ADD('ZMM28');
- FReg64ZMMIndex.ADD('ZMM29');
- FReg64ZMMIndex.ADD('ZMM30');
- FReg64ZMMIndex.ADD('ZMM31');
- FRegKREG.ADD('K0');
- FRegKREG.ADD('K1');
- FRegKREG.ADD('K2');
- FRegKREG.ADD('K3');
- FRegKREG.ADD('K4');
- FRegKREG.ADD('K5');
- FRegKREG.ADD('K6');
- FRegKREG.ADD('K7');
- end;
- destructor TAsmTestGenerator.Destroy;
- begin
- FreeAndNil(FReg8);
- FreeAndNil(FReg16);
- FreeAndNil(FReg32Base);
- FreeAndNil(FReg32Index);
- FreeAndNil(FReg64Base);
- FreeAndNil(FReg64Index);
- FreeAndNil(FReg6432Base);
- FreeAndNil(FReg6432Index);
- FreeAndNil(FReg32XMMIndex);
- FreeAndNil(FReg32YMMIndex);
- FreeAndNil(FReg32ZMMIndex);
- FreeAndNil(FReg64XMMIndex);
- FreeAndNil(FReg64YMMIndex);
- FreeAndNil(FReg64ZMMIndex);
- FreeAndnil(FRegKREG);
- inherited;
- end;
- procedure TAsmTestGenerator.MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg,
- aSLIndexReg, aRList: TStringList);
- var
- il_Base: integer;
- il_Index: integer;
- begin
- for il_Base := 0 to aSLBaseReg.Count - 1 do
- begin
- aRList.Add(format(aPrefix + '[%s]%s', [aSLBaseReg[il_Base], aSuffix]));
- for il_Index := 0 to aSLIndexReg.Count - 1 do
- begin
- aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s + $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s + $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s - $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s - $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 8 + 64]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- end;
- end;
- end;
- procedure TAsmTestGenerator.MemRegBaseIndexCombiCDISP8N(const aPrefix,
- aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
- var
- iBase: integer;
- iIndex: integer;
- iOffset: integer;
- begin
- for iBase := 0 to aSLBaseReg.Count - 1 do
- begin
- for iOffset := 0 to 63 do
- begin
- aRList.Add(format(aPrefix + '[%s +%2d]', [aSLBaseReg[iBase], iOffset]));
- for iIndex := 0 to aSLIndexReg.Count - 1 do
- begin
- if aSLBaseReg[iBase] <> aSLIndexReg[iIndex] then
- begin
- aRList.Add(format(aPrefix + '[%s + %s + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
- aRList.Add(format(aPrefix + '[%s + %s * 2 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
- aRList.Add(format(aPrefix + '[%s + %s * 4 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
- aRList.Add(format(aPrefix + '[%s + %s * 8 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
- end;
- end;
- end;
- end;
- end;
- procedure TAsmTestGenerator.VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String;
- aSLBaseReg, aSLIndexReg, aRList: TStringList);
- var
- il_Base: integer;
- il_Index: integer;
- begin
- //for il_Index := 0 to aSLIndexReg.Count - 1 do
- //begin
- // aRList.Add(format(aPrefix + '[%s]', [aSLIndexReg[il_Index]]));
- //
- // aRList.Add(format(aPrefix + '[%s * 2]', [aSLIndexReg[il_Index]]));
- // aRList.Add(format(aPrefix + '[%s * 4]', [aSLIndexReg[il_Index]]));
- // aRList.Add(format(aPrefix + '[%s * 8]', [aSLIndexReg[il_Index]]));
- //
- // aRList.Add(format(aPrefix + '[%s * 2 + 16]', [aSLIndexReg[il_Index]]));
- // aRList.Add(format(aPrefix + '[%s * 4 + 32]', [aSLIndexReg[il_Index]]));
- // aRList.Add(format(aPrefix + '[%s * 8 + 48]', [aSLIndexReg[il_Index]]));
- //end;
- for il_Base := 0 to aSLBaseReg.Count - 1 do
- begin
- //aRList.Add(format(aPrefix + '[%s]', [aSLBaseReg[il_Base]]));
- for il_Index := 0 to aSLIndexReg.Count - 1 do
- begin
- aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- //aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
- //aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
- //aRList.Add(format(aPrefix + '[%s + %s * 8 + 48]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
- aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLIndexReg[il_Index], aSLBaseReg[il_Base], aSuffix]));
- //aRList.Add(format(aPrefix + '[%s + %s + 16]', [aSLIndexReg[il_Index], aSLBaseReg[il_Base]]));
- end;
- end;
- end;
- function TAsmTestGenerator.ParseBaseIndexReg(const aOp: string; var aBaseReg,
- aIndexReg: string): boolean;
- var
- iStartPos: integer;
- iEndPos: integer;
- iPos: integer;
- sOp: string;
- sBaseReg: string;
- sIndexReg: string;
- begin
- result := false;
- aBaseReg := '';
- aIndexReg := '';
- iStartPos := Pos('[', aOp);
- iEndPos := Pos(']', aOp);
- if (iStartPos > 0) and
- (iEndPos > 0) and
- (iStartPos < iEndPos) then
- begin
- sOp := trim(copy(aOp, iStartPos + 1, iEndPos - iStartPos - 1));
- with TStringList.Create do
- try
- CommaText := StringReplace(sOp, '+', ',', [rfReplaceAll]);
- while Count < 2 do Add('');
- sBaseReg := trim(Strings[0]);
- if (FReg32Base.IndexOf(sBasereg) >= 0) or
- (FReg64Base.IndexOf(sBasereg) >= 0) or
- (FReg6432Base.IndexOf(sBasereg) >= 0) then
- aBaseReg := sBaseReg;
- sIndexReg := trim(Strings[1]);
- if (FReg32Index.IndexOf(sIndexReg) >= 0) or
- (FReg64Index.IndexOf(sIndexReg) >= 0) or
- (FReg6432Index.IndexOf(sIndexReg) >= 0) then
- aIndexReg := sIndexReg;
- result := trim(aBasereg) <> '';
- finally
- Free;
- end;
- end;
- end;
- class procedure TAsmTestGenerator.CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
- aOp4: String; aSL: TStringList);
- var
- sl: TStringList;
- begin
- with TAsmTestGenerator.Create do
- try
- Fx64 := aX64;
- FAVX512 := aAVX512;
- FSAE := aSAE;
- sl := InternalCalcTestData(aInst, aOp1, aOp2, aOp3, aOp4);
- try
- aSL.AddStrings(sl);
- finally
- FreeAndNil(sl);
- end;
- finally
- Free;
- end;
- end;
- class procedure TAsmTestGenerator.CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
- aOp4: String; aSL: TStringList);
- var
- sl: TStringList;
- begin
- with TAsmTestGenerator.Create do
- try
- Fx64 := aX64;
- FAVX512 := aAVX512;
- FSAE := aSAE;
- sl := InternalCalcTestDataMREF(aInst, aOp1, aOp2, aOp3, aOp4);
- try
- aSL.AddStrings(sl);
- finally
- FreeAndNil(sl);
- end;
- finally
- Free;
- end;
- end;
- class procedure TAsmTestGenerator.CalcTestDataCDisp8(aX64, aAVX512,
- aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
- var
- sl: TStringList;
- begin
- with TAsmTestGenerator.Create do
- try
- Fx64 := aX64;
- FAVX512 := aAVX512;
- FSAE := aSAE;
- sl := InternalCalcTestDataCDisp8(aInst, aOp1, aOp2, aOp3, aOp4);
- try
- aSL.AddStrings(sl);
- finally
- FreeAndNil(sl);
- end;
- finally
- Free;
- end;
- end;
- class procedure TAsmTestGenerator.CalcTestInstFile;
- var
- i,j: integer;
- sInst: string;
- sI386: string;
- sX8664: string;
- sAVX512: string;
- sOperands: string;
- sLine: string;
- sl: TStringList;
- bVEX: boolean;
- bEVEX: boolean;
- b256 : boolean;
- b512 : boolean;
- begin
- sl := TStringList.Create;
- try
- //tinsentry=packed record
- // opcode : tasmop;
- // ops : byte;
- // //optypes : array[0..max_operands-1] of longint;
- // optypes : array[0..3] of int64; //TG
- // code : array[0..11] of char;
- // flags : tinsflags;
- //end;
- for i := 0 to length(InsTab) - 1 do
- begin
- bVEX := false;
- bEVEX := false;
- b256 := false;
- b512 := false;
- //TG TODO delete
- if instab[i].opcode = a_vtestps then
- begin
- b512 := b512;
- end;
- for j := 0 to length(InsTab[i].code) - 1 do
- begin
- case ord(InsTab[i].code[j]) of
- 0: break;
- 1,2,3: break;
- 232: bEVEX := true;
- 233: b512 := true;
- 242: bVEX := true;
- 244: b256 := true;
- end;
- end;
- if bVEX or bEVEX then
- begin
- sInst := std_op2str[InsTab[i].opcode];
- sI386 := '1';
- sX8664 := '1';
- if IF_X86_64 in InsTab[i].flags then
- begin
- sI386 := '0';
- end;
- if bEVEX then sAVX512 := '1'
- else sAVX512 := '0';
- sOperands := '';
- for j := 0 to 3 do
- begin
- case InsTab[i].optypes[j] of
- OT_XMMREG: sOperands := sOperands + 'XMMREG,';
- OT_XMMREG_M: sOperands := sOperands + 'XMMREG_M,';
- OT_XMMREG_MZ: sOperands := sOperands + 'XMMREG_MZ,';
- OT_XMMREG_ER: sOperands := sOperands + 'XMMREG_ER,';
- OT_XMMREG_SAE: sOperands := sOperands + 'XMMREG_SAE,';
- OT_XMMRM: sOperands := sOperands + 'XMMRM,';
- OT_XMMRM_MZ: sOperands := sOperands + 'XMMRM_MZ,';
- OT_YMMREG: sOperands := sOperands + 'YMMREG,';
- OT_YMMREG_M: sOperands := sOperands + 'YMMREG_M,';
- OT_YMMREG_MZ: sOperands := sOperands + 'YMMREG_MZ,';
- OT_YMMREG_ER: sOperands := sOperands + 'YMMREG_ER,';
- OT_YMMREG_SAE: sOperands := sOperands + 'YMMREG_SAE,';
- OT_YMMRM: sOperands := sOperands + 'YMMRM,';
- OT_YMMRM_MZ: sOperands := sOperands + 'YMMRM_MZ,';
- OT_ZMMREG: sOperands := sOperands + 'ZMMREG,';
- OT_ZMMREG_M: sOperands := sOperands + 'ZMMREG_M,';
- OT_ZMMREG_MZ: sOperands := sOperands + 'ZMMREG_MZ,';
- OT_ZMMREG_ER: sOperands := sOperands + 'ZMMREG_ER,';
- OT_ZMMREG_SAE: sOperands := sOperands + 'ZMMREG_SAE,';
- OT_ZMMRM: sOperands := sOperands + 'ZMMRM,';
- OT_ZMMRM_MZ: sOperands := sOperands + 'ZMMRM_MZ,';
- OT_MEM32: sOperands := sOperands + 'MEM32,';
- OT_MEM64: sOperands := sOperands + 'MEM64,';
- OT_MEM128: sOperands := sOperands + 'MEM128,';
- OT_MEM256: sOperands := sOperands + 'MEM256,';
- OT_MEM512: sOperands := sOperands + 'MEM512,';
- OT_REG32: sOperands := sOperands + 'REG32,';
- OT_REG64: sOperands := sOperands + 'REG64,';
- ot_rm_gpr or ot_bits32:
- sOperands := sOperands + 'RM32,';
- ot_rm_gpr or ot_bits64:
- sOperands := sOperands + 'RM64,';
- OT_XMEM32: sOperands := sOperands + 'XMEM32,';
- OT_XMEM64: sOperands := sOperands + 'XMEM64,';
- OT_YMEM32: sOperands := sOperands + 'YMEM32,';
- OT_YMEM64: sOperands := sOperands + 'YMEM64,';
- OT_IMM8: sOperands := sOperands + 'IMM8,';
- OT_NONE: sOperands := sOperands + ',';
- OT_BMEM32: if b512 then sOperands := sOperands + '16B32,'
- else if b256 then sOperands := sOperands + '8B32,'
- else sOperands := sOperands + '4B32,';
- OT_BMEM64: if b512 then sOperands := sOperands + '8B32,'
- else if b256 then sOperands := sOperands + '4B32,'
- else sOperands := sOperands + '2B64,';
- OT_KREG: sOperands := sOperands + 'KREG,';
- OT_KREG_M: sOperands := sOperands + 'KREG_M,';
- else sOperands := sOperands;
- end;
- end;
- sOperands := copy(sOperands, 1, length(sOperands) - 1);
- sl.Add(format('FOpCodeList.Add(''%s,%s,%s,%s,%s'');', [sInst, sI386, sX8664, sAVX512, sOperands]));
- end;
- end;
- sl.Savetofile('/tmp/fpcavx512.txt');
- // std_op2str
- finally
- FreeAndnil(sl);
- end;
- end;
- class procedure TAsmTestGenerator.ListMemRefState;
- var
- i: integer;
- sGasSufffix: string;
- mrsize: TMemRefSizeInfo;
- opcode: tasmop;
- sl: TStringList;
- slEmpty: TStringList;
- begin
- BuildInsTabCache;
- BuildInsTabMemRefSizeInfoCache;
- slEmpty := TStringList.Create;
- try
- for mrsize := low(TMemRefSizeInfo) to high(TMemRefSizeInfo) do
- begin
- sl := TStringList.Create;
- try
- for opcode:=low(tasmop) to high(tasmop) do
- begin
- if InsTabMemRefSizeInfoCache^[opcode].MemRefSize = mrsize then
- begin
- sGasSufffix:='';
- if gas_needsuffix[opcode] <> AttSufNone then
- sGasSufffix:=GetEnumName(Typeinfo(TAttSuffix), ord(gas_needsuffix[opcode]));
- sl.add(format('%-25s: %s: %s', [GetEnumName(Typeinfo(TMemRefSizeInfo), ord(mrsize)), std_op2str[opcode], sGasSufffix]));
- end;
- end;
- sl.Sort;
- if sl.Count > 0 then
- begin
- writeln;
- writeln(sl.text);
- end
- else slEmpty.Add(GetEnumName(Typeinfo(TMemRefSizeInfo), ord(mrsize)));
- finally
- FreeAndNil(sl);
- end;
- end;
- slEmpty.Sort;
- writeln('');
- writeln(slEmpty.Text);
- finally
- FreeAndNil(slEmpty);
- end;
- if assigned(instabcache) then
- begin
- dispose(instabcache);
- instabcache:=nil;
- end;
- if assigned(InsTabMemRefSizeInfoCache) then
- begin
- dispose(InsTabMemRefSizeInfoCache);
- InsTabMemRefSizeInfoCache:=nil;
- end;
- end;
- end.
|