2
0

asmtestgenerator.pas 147 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134
  1. {
  2. Copyright (C) <avx-testfile-generator> <Torsten Grundke>
  3. This source is free software; you can redistribute it and/or modify it under
  4. the terms of the GNU General Public License as published by the Free
  5. Software Foundation; either version 2 of the License, or (at your option)
  6. any later version.
  7. This code is distributed in the hope that it will be useful, but WITHOUT ANY
  8. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. details.
  11. A copy of the GNU General Public License is available on the World Wide Web
  12. at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
  13. to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  14. MA 02110-1301, USA.
  15. }
  16. {$mode objfpc}
  17. unit asmtestgenerator;
  18. interface
  19. uses BaseList, Classes;
  20. type
  21. TOpType = (otUnknown, otXMMReg, otXMMRM, otXMMRM16, otXMMRM8, otYMMReg, otYMMRM, otZMMReg, otZMMRM, otEAX, otRAX, otMem32,
  22. otMem8, otMem16, otMem64, otMem128, otMem256, otMem512, otREG64, otREG32, otREG16, otREG8, otRM32, otRM64, otIMM8,
  23. otXMEM32, otXMEM64, otYMEM32, otYMEM64, otZMEM32, otZMEM64,
  24. otB32, otB64, otKREG);
  25. TOperandListItem = class(TObject)
  26. private
  27. FOpActive: boolean;
  28. FOpNumber: integer;
  29. FOpTyp: TOpType;
  30. FValues: TStringList;
  31. public
  32. constructor Create;
  33. destructor Destroy; override;
  34. property OpNumber: integer read FOpNumber write FOpNumber;
  35. property OpTyp: TOpType read FOpTyp write FOpTyp;
  36. property OpActive: boolean read FOpActive write FOpActive;
  37. property Values: TStringList read FValues;
  38. end;
  39. TOperandList = class(TBaseList)
  40. private
  41. function GetItems(aIndex: integer): TOperandListItem;
  42. public
  43. function Add(aItem: TOperandListItem): integer;
  44. property Items[aIndex: integer]: TOperandListItem read GetItems;
  45. end;
  46. { TAsmTestGenerator }
  47. TAsmTestGenerator = class(TObject)
  48. private
  49. FReg8 : TStringList;
  50. FReg16 : TStringList;
  51. FReg32Base : TStringList;
  52. FReg32Index : TStringList;
  53. FReg64Base : TStringList;
  54. FReg64Index : TStringList;
  55. FReg6432Base : TStringList;
  56. FReg6432Index : TStringList;
  57. FReg32XMMIndex : TStringList;
  58. FReg32YMMIndex : TStringList;
  59. FReg32ZMMIndex : TStringList;
  60. FReg64XMMIndex : TStringList;
  61. FReg64YMMIndex : TStringList;
  62. FReg64ZMMIndex : TStringList;
  63. FRegKREG : TStringList;
  64. Fx64: boolean;
  65. FAVX512: boolean;
  66. FSAE: boolean;
  67. procedure MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
  68. procedure VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
  69. function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
  70. function InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
  71. public
  72. constructor Create;
  73. destructor Destroy; override;
  74. class procedure CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  75. class procedure CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  76. class procedure CalcTestInstFile;
  77. class procedure ListMemRefState;
  78. property x64: boolean read Fx64;
  79. end;
  80. implementation
  81. uses SysUtils, Dialogs, typinfo;
  82. type
  83. TAsmOp={$i ../../../compiler/x86_64/x8664op.inc}
  84. TMemRefSizeInfo = (msiUnknown, msiUnsupported, msiNoSize, msiNoMemRef,
  85. msiMultiple, msiMultipleMinSize8, msiMultipleMinSize16, msiMultipleMinSize32,
  86. msiMultipleMinSize64, msiMultipleMinSize128, msiMultipleminSize256, msiMultipleMinSize512,
  87. msiMemRegSize, msiMemRegx16y32, msiMemRegx16y32z64, msiMemRegx32y64, msiMemRegx32y64z128, msiMemRegx64y128, msiMemRegx64y128z256,
  88. msiMemRegx64y256, msiMemRegx64y256z512,
  89. msiMem8, msiMem16, msiMem32, msiBMem32, msiMem64, msiBMem64, msiMem128, msiMem256, msiMem512,
  90. msiXMem32, msiXMem64, msiYMem32, msiYMem64, msiZMem32, msiZMem64,
  91. msiVMemMultiple, msiVMemRegSize,
  92. msiMemRegConst128,msiMemRegConst256,msiMemRegConst512);
  93. TMemRefSizeInfoBCST = (msbUnknown, msbBCST32, msbBCST64, msbMultiple);
  94. TMemRefSizeInfoBCSTType = (btUnknown, bt1to2, bt1to4, bt1to8, bt1to16);
  95. TEVEXTupleState = (etsUnknown, etsIsTuple, etsNotTuple);
  96. TConstSizeInfo = (csiUnknown, csiMultiple, csiNoSize, csiMem8, csiMem16, csiMem32, csiMem64);
  97. TInsTabMemRefSizeInfoRec = record
  98. MemRefSize : TMemRefSizeInfo;
  99. MemRefSizeBCST : TMemRefSizeInfoBCST;
  100. BCSTXMMMultiplicator : byte;
  101. ExistsSSEAVX : boolean;
  102. ConstSize : TConstSizeInfo;
  103. BCSTTypes : Set of TMemRefSizeInfoBCSTType;
  104. RegXMMSizeMask : int64;
  105. RegYMMSizeMask : int64;
  106. RegZMMSizeMask : int64;
  107. end;
  108. TInsTabMemRefSizeInfoCache=array[TasmOp] of TInsTabMemRefSizeInfoRec;
  109. PInsTabMemRefSizeInfoCache=^TInsTabMemRefSizeInfoCache;
  110. TInsTabCache=array[TasmOp] of longint;
  111. PInsTabCache=^TInsTabCache;
  112. const
  113. instabentries = {$i ../../../compiler/x86_64/x8664nop.inc}
  114. MemRefMultiples: set of TMemRefSizeInfo = [msiMultiple, msiMultipleMinSize8,
  115. msiMultipleMinSize16, msiMultipleMinSize32,
  116. msiMultipleMinSize64, msiMultipleMinSize128,
  117. msiMultipleMinSize256, msiMultipleMinSize512,
  118. msiVMemMultiple];
  119. MemRefSizeInfoVMems: Set of TMemRefSizeInfo = [msiXMem32, msiXMem64, msiYMem32, msiYMem64,
  120. msiZMem32, msiZMem64,
  121. msiVMemMultiple, msiVMemRegSize];
  122. var
  123. InsTabCache : PInsTabCache;
  124. InsTabMemRefSizeInfoCache: PInsTabMemRefSizeInfoCache;
  125. type
  126. op2strtable=array[tasmop] of string[16];
  127. {Instruction flags }
  128. tinsflag = (
  129. { please keep these in order and in sync with IF_SMASK }
  130. IF_SM, { size match first two operands }
  131. IF_SM2,
  132. IF_SB, { unsized operands can't be non-byte }
  133. IF_SW, { unsized operands can't be non-word }
  134. IF_SD, { unsized operands can't be nondword }
  135. { unsized argument spec }
  136. { please keep these in order and in sync with IF_ARMASK }
  137. IF_AR0, { SB, SW, SD applies to argument 0 }
  138. IF_AR1, { SB, SW, SD applies to argument 1 }
  139. IF_AR2, { SB, SW, SD applies to argument 2 }
  140. IF_PRIV, { it's a privileged instruction }
  141. IF_SMM, { it's only valid in SMM }
  142. IF_PROT, { it's protected mode only }
  143. IF_NOX86_64, { removed instruction in x86_64 }
  144. IF_UNDOC, { it's an undocumented instruction }
  145. IF_FPU, { it's an FPU instruction }
  146. IF_MMX, { it's an MMX instruction }
  147. { it's a 3DNow! instruction }
  148. IF_3DNOW,
  149. { it's a SSE (KNI, MMX2) instruction }
  150. IF_SSE,
  151. { SSE2 instructions }
  152. IF_SSE2,
  153. { SSE3 instructions }
  154. IF_SSE3,
  155. { SSE64 instructions }
  156. IF_SSE64,
  157. { SVM instructions }
  158. IF_SVM,
  159. { SSE4 instructions }
  160. IF_SSE4,
  161. IF_SSSE3,
  162. IF_SSE41,
  163. IF_SSE42,
  164. IF_MOVBE,
  165. IF_CLMUL,
  166. IF_AVX,
  167. IF_AVX2,
  168. IF_AVX512,
  169. IF_BMI1,
  170. IF_BMI2,
  171. { Intel ADX (Multi-Precision Add-Carry Instruction Extensions) }
  172. IF_ADX,
  173. IF_16BITONLY,
  174. IF_FMA,
  175. IF_FMA4,
  176. IF_TSX,
  177. IF_RAND,
  178. IF_XSAVE,
  179. IF_PREFETCHWT1,
  180. { mask for processor level }
  181. { please keep these in order and in sync with IF_PLEVEL }
  182. IF_8086, { 8086 instruction }
  183. IF_186, { 186+ instruction }
  184. IF_286, { 286+ instruction }
  185. IF_386, { 386+ instruction }
  186. IF_486, { 486+ instruction }
  187. IF_PENT, { Pentium instruction }
  188. IF_P6, { P6 instruction }
  189. IF_KATMAI, { Katmai instructions }
  190. IF_WILLAMETTE, { Willamette instructions }
  191. IF_PRESCOTT, { Prescott instructions }
  192. IF_X86_64,
  193. IF_SANDYBRIDGE, { Sandybridge-specific instruction }
  194. IF_NEC, { NEC V20/V30 instruction }
  195. { the following are not strictly part of the processor level, because
  196. they are never used standalone, but always in combination with a
  197. separate processor level flag. Therefore, they use bits outside of
  198. IF_PLEVEL, otherwise they would mess up the processor level they're
  199. used in combination with.
  200. The following combinations are currently used:
  201. [IF_AMD, IF_P6],
  202. [IF_CYRIX, IF_486],
  203. [IF_CYRIX, IF_PENT],
  204. [IF_CYRIX, IF_P6] }
  205. IF_CYRIX, { Cyrix, Centaur or VIA-specific instruction }
  206. IF_AMD, { AMD-specific instruction }
  207. { added flags }
  208. IF_PRE, { it's a prefix instruction }
  209. IF_PASS2, { if the instruction can change in a second pass }
  210. IF_IMM4, { immediate operand is a nibble (must be in range [0..15]) }
  211. IF_IMM3, { immediate operand is a triad (must be in range [0..7]) }
  212. IF_BCST2,
  213. IF_BCST4,
  214. IF_BCST8,
  215. IF_BCST16,
  216. IF_T2, { disp8 - tuple - 2 }
  217. IF_T4, { disp8 - tuple - 4 }
  218. IF_T8, { disp8 - tuple - 8 }
  219. IF_T1S, { disp8 - tuple - 1 scalar }
  220. IF_T1S8,
  221. IF_T1S16,
  222. IF_T1F32,
  223. IF_T1F64,
  224. IF_TMDDUP,
  225. IF_TFV, { disp8 - tuple - full vector }
  226. IF_TFVM, { disp8 - tuple - full vector memory }
  227. IF_TQVM,
  228. IF_TMEM128,
  229. IF_THV,
  230. IF_THVM,
  231. IF_TOVM,
  232. IF_SCL32,
  233. IF_SCL64
  234. );
  235. tinsflags=set of tinsflag;
  236. tinsentry=packed record
  237. opcode : tasmop;
  238. ops : byte;
  239. //optypes : array[0..max_operands-1] of longint;
  240. optypes : array[0..3] of int64; //TG
  241. code : array[0..11] of char;
  242. flags : tinsflags;
  243. end;
  244. pinsentry=^tinsentry;
  245. const
  246. OT_NONE = $00000000;
  247. { Bits 0..7: sizes }
  248. OT_BITS8 = $00000001;
  249. OT_BITS16 = $00000002;
  250. OT_BITS32 = $00000004;
  251. OT_BITS64 = $00000008; { x86_64 and FPU }
  252. //OT_BITS128 = $10000000; { 16 byte SSE }
  253. //OT_BITS256 = $20000000; { 32 byte AVX }
  254. //OT_BITS512 = $40000000; { 64 byte AVX512 }
  255. OT_BITS128 = $20000000; { 16 byte SSE }
  256. OT_BITS256 = $40000000; { 32 byte AVX }
  257. OT_BITS512 = $80000000; { 64 byte AVX512 }
  258. OT_VECTORMASK = $1000000000; { OPTIONAL VECTORMASK AVX512}
  259. OT_VECTORZERO = $2000000000; { OPTIONAL ZERO-FLAG AVX512}
  260. OT_VECTORBCST = $4000000000; { BROADCAST-MEM-FLAG AVX512}
  261. OT_VECTORSAE = $8000000000; { OPTIONAL SAE-FLAG AVX512}
  262. OT_VECTORER = $10000000000; { OPTIONAL ER-FLAG-FLAG AVX512}
  263. OT_BITSB32 = OT_BITS32 or OT_VECTORBCST;
  264. OT_BITSB64 = OT_BITS64 or OT_VECTORBCST;
  265. OT_VECTOR_EXT_MASK = OT_VECTORMASK or OT_VECTORZERO or OT_VECTORBCST;
  266. OT_BITS80 = $00000010; { FPU only }
  267. OT_FAR = $00000020; { this means 16:16 or 16:32, like in CALL/JMP }
  268. OT_NEAR = $00000040;
  269. OT_SHORT = $00000080;
  270. { TODO: FAR/NEAR/SHORT are sizes too, they should be included into size mask,
  271. but this requires adjusting the opcode table }
  272. //OT_SIZE_MASK = $3000001F; { all the size attributes }
  273. OT_SIZE_MASK = $E000001F; { all the size attributes }
  274. OT_NON_SIZE = int64(not int64(OT_SIZE_MASK));
  275. { Bits 8..11: modifiers }
  276. OT_SIGNED = $00000100; { the operand need to be signed -128-127 }
  277. OT_TO = $00000200; { reverse effect in FADD, FSUB &c }
  278. OT_COLON = $00000400; { operand is followed by a colon }
  279. OT_MODIFIER_MASK = $00000F00;
  280. { Bits 12..15: type of operand }
  281. OT_REGISTER = $00001000;
  282. OT_IMMEDIATE = $00002000;
  283. OT_MEMORY = $0000C000; { always includes 'OT_REGMEM' bit as well }
  284. OT_REGMEM = $00008000; { for r/m, ie EA, operands }
  285. OT_TYPE_MASK = OT_REGISTER or OT_IMMEDIATE or OT_MEMORY or OT_REGMEM;
  286. OT_REGNORM = OT_REGISTER or OT_REGMEM; { 'normal' reg, qualifies as EA }
  287. { Bits 20..22, 24..26: register classes
  288. otf_* consts are not used alone, only to build other constants. }
  289. otf_reg_cdt = $00100000;
  290. otf_reg_gpr = $00200000;
  291. otf_reg_sreg = $00400000;
  292. otf_reg_k = $00800000;
  293. otf_reg_fpu = $01000000;
  294. otf_reg_mmx = $02000000;
  295. otf_reg_xmm = $04000000;
  296. otf_reg_ymm = $08000000;
  297. otf_reg_zmm = $10000000;
  298. otf_reg_extra_mask = $0F000000;
  299. { Bits 16..19: subclasses, meaning depends on classes field }
  300. otf_sub0 = $00010000;
  301. otf_sub1 = $00020000;
  302. otf_sub2 = $00040000;
  303. otf_sub3 = $00080000;
  304. OT_REG_SMASK = otf_sub0 or otf_sub1 or otf_sub2 or otf_sub3;
  305. //OT_REG_EXTRA_MASK = $0F000000;
  306. OT_REG_EXTRA_MASK = $1F000000;
  307. OT_REG_TYPMASK = otf_reg_cdt or otf_reg_gpr or otf_reg_sreg or otf_reg_k or otf_reg_extra_mask;
  308. { register class 0: CRx, DRx and TRx }
  309. OT_REG_CDT = OT_REGISTER or otf_reg_cdt or OT_BITS64;
  310. OT_REG_CREG = OT_REG_CDT or otf_sub0; { CRn }
  311. OT_REG_DREG = OT_REG_CDT or otf_sub1; { DRn }
  312. OT_REG_TREG = OT_REG_CDT or otf_sub2; { TRn }
  313. OT_REG_CR4 = OT_REG_CDT or otf_sub3; { CR4 (Pentium only) }
  314. { register class 1: general-purpose registers }
  315. OT_REG_GPR = OT_REGNORM or otf_reg_gpr;
  316. OT_RM_GPR = OT_REGMEM or otf_reg_gpr;
  317. OT_REG8 = OT_REG_GPR or OT_BITS8; { 8-bit GPR }
  318. OT_REG16 = OT_REG_GPR or OT_BITS16;
  319. OT_REG32 = OT_REG_GPR or OT_BITS32;
  320. OT_REG64 = OT_REG_GPR or OT_BITS64;
  321. { GPR subclass 0: accumulator: AL, AX, EAX or RAX }
  322. OT_REG_ACCUM = OT_REG_GPR or otf_sub0;
  323. OT_REG_AL = OT_REG_ACCUM or OT_BITS8;
  324. OT_REG_AX = OT_REG_ACCUM or OT_BITS16;
  325. OT_REG_EAX = OT_REG_ACCUM or OT_BITS32;
  326. OT_REG_RAX = OT_REG_ACCUM or OT_BITS64;
  327. { GPR subclass 1: counter: CL, CX, ECX or RCX }
  328. OT_REG_COUNT = OT_REG_GPR or otf_sub1;
  329. OT_REG_CL = OT_REG_COUNT or OT_BITS8;
  330. OT_REG_CX = OT_REG_COUNT or OT_BITS16;
  331. OT_REG_ECX = OT_REG_COUNT or OT_BITS32;
  332. OT_REG_RCX = OT_REG_COUNT or OT_BITS64;
  333. { GPR subclass 2: data register: DL, DX, EDX or RDX }
  334. OT_REG_DX = OT_REG_GPR or otf_sub2 or OT_BITS16;
  335. OT_REG_EDX = OT_REG_GPR or otf_sub2 or OT_BITS32;
  336. { register class 2: Segment registers }
  337. OT_REG_SREG = OT_REGISTER or otf_reg_sreg or OT_BITS16;
  338. OT_REG_CS = OT_REG_SREG or otf_sub0; { CS }
  339. OT_REG_DESS = OT_REG_SREG or otf_sub1; { DS, ES, SS (non-CS 86 registers) }
  340. OT_REG_FSGS = OT_REG_SREG or otf_sub2; { FS, GS (386 extended registers) }
  341. { register class 3: FPU registers }
  342. OT_FPUREG = OT_REGISTER or otf_reg_fpu;
  343. OT_FPU0 = OT_FPUREG or otf_sub0; { FPU stack register zero }
  344. { register class 4: MMX (both reg and r/m) }
  345. OT_MMXREG = OT_REGNORM or otf_reg_mmx;
  346. OT_MMXRM = OT_REGMEM or otf_reg_mmx;
  347. { register class 5: XMM (both reg and r/m) }
  348. OT_XMMREG = OT_REGNORM or otf_reg_xmm;
  349. OT_XMMRM = OT_REGMEM or otf_reg_xmm;
  350. OT_XMEM32 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS32;
  351. OT_XMEM32_M = OT_XMEM32 or OT_VECTORMASK;
  352. OT_XMEM64 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS64;
  353. OT_XMEM64_M = OT_XMEM64 or OT_VECTORMASK;
  354. OT_XMMREG_M = OT_XMMREG or OT_VECTORMASK;
  355. OT_XMMREG_MZ = OT_XMMREG or OT_VECTORMASK or OT_VECTORZERO;
  356. OT_XMMRM_MZ = OT_XMMRM or OT_VECTORMASK or OT_VECTORZERO;
  357. OT_XMMREG_SAE = OT_XMMREG or OT_VECTORSAE;
  358. OT_XMMRM_SAE = OT_XMMRM or OT_VECTORSAE;
  359. OT_XMMREG_ER = OT_XMMREG or OT_VECTORER;
  360. OT_XMMRM_ER = OT_XMMRM or OT_VECTORER;
  361. { register class 5: YMM (both reg and r/m) }
  362. OT_YMMREG = OT_REGNORM or otf_reg_ymm;
  363. OT_YMMRM = OT_REGMEM or otf_reg_ymm;
  364. OT_YMEM32 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS32;
  365. OT_YMEM32_M = OT_YMEM32 or OT_VECTORMASK;
  366. OT_YMEM64 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS64;
  367. OT_YMEM64_M = OT_YMEM64 or OT_VECTORMASK;
  368. OT_YMMREG_M = OT_YMMREG or OT_VECTORMASK;
  369. OT_YMMREG_MZ = OT_YMMREG or OT_VECTORMASK or OT_VECTORZERO;
  370. OT_YMMRM_MZ = OT_YMMRM or OT_VECTORMASK or OT_VECTORZERO;
  371. OT_YMMREG_SAE = OT_YMMREG or OT_VECTORSAE;
  372. OT_YMMRM_SAE = OT_YMMRM or OT_VECTORSAE;
  373. OT_YMMREG_ER = OT_YMMREG or OT_VECTORER;
  374. OT_YMMRM_ER = OT_YMMRM or OT_VECTORER;
  375. { register class 5: ZMM (both reg and r/m) }
  376. OT_ZMMREG = OT_REGNORM or otf_reg_zmm;
  377. OT_ZMMRM = OT_REGMEM or otf_reg_zmm;
  378. OT_ZMEM32 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS32;
  379. OT_ZMEM32_M = OT_ZMEM32 or OT_VECTORMASK;
  380. OT_ZMEM64 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS64;
  381. OT_ZMEM64_M = OT_ZMEM64 or OT_VECTORMASK;
  382. OT_ZMMREG_M = OT_ZMMREG or OT_VECTORMASK;
  383. OT_ZMMREG_MZ = OT_ZMMREG or OT_VECTORMASK or OT_VECTORZERO;
  384. OT_ZMMRM_MZ = OT_ZMMRM or OT_VECTORMASK or OT_VECTORZERO;
  385. OT_ZMMREG_SAE = OT_ZMMREG or OT_VECTORSAE;
  386. OT_ZMMRM_SAE = OT_ZMMRM or OT_VECTORSAE;
  387. OT_ZMMREG_ER = OT_ZMMREG or OT_VECTORER;
  388. OT_ZMMRM_ER = OT_ZMMRM or OT_VECTORER;
  389. OT_KREG = OT_REGNORM or otf_reg_k;
  390. OT_KREG_M = OT_KREG or OT_VECTORMASK;
  391. { Vector-Memory operands }
  392. OT_VMEM_ANY = OT_XMEM32 or OT_XMEM64 or OT_YMEM32 or OT_YMEM64 or OT_ZMEM32 or OT_ZMEM64;
  393. { Memory operands }
  394. OT_MEM8 = OT_MEMORY or OT_BITS8;
  395. OT_MEM16 = OT_MEMORY or OT_BITS16;
  396. OT_MEM16_M = OT_MEM16 or OT_VECTORMASK;
  397. OT_MEM32 = OT_MEMORY or OT_BITS32;
  398. OT_MEM32_M = OT_MEMORY or OT_BITS32 or OT_VECTORMASK;
  399. OT_BMEM32 = OT_MEMORY or OT_BITS32 or OT_VECTORBCST;
  400. OT_BMEM32_SAE= OT_MEMORY or OT_BITS32 or OT_VECTORBCST or OT_VECTORSAE;
  401. OT_MEM64 = OT_MEMORY or OT_BITS64;
  402. OT_MEM64_M = OT_MEMORY or OT_BITS64 or OT_VECTORMASK;
  403. OT_BMEM64 = OT_MEMORY or OT_BITS64 or OT_VECTORBCST;
  404. OT_BMEM64_SAE= OT_MEMORY or OT_BITS64 or OT_VECTORBCST or OT_VECTORSAE;
  405. OT_MEM128 = OT_MEMORY or OT_BITS128;
  406. OT_MEM128_M = OT_MEMORY or OT_BITS128 or OT_VECTORMASK;
  407. OT_MEM256 = OT_MEMORY or OT_BITS256;
  408. OT_MEM256_M = OT_MEMORY or OT_BITS256 or OT_VECTORMASK;
  409. OT_MEM512 = OT_MEMORY or OT_BITS512;
  410. OT_MEM512_M = OT_MEMORY or OT_BITS512 or OT_VECTORMASK;
  411. OT_MEM80 = OT_MEMORY or OT_BITS80;
  412. OT_MEM_OFFS = OT_MEMORY or otf_sub0; { special type of EA }
  413. { simple [address] offset }
  414. { Matches any type of r/m operand }
  415. 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;
  416. { Immediate operands }
  417. OT_IMM8 = OT_IMMEDIATE or OT_BITS8;
  418. OT_IMM16 = OT_IMMEDIATE or OT_BITS16;
  419. OT_IMM32 = OT_IMMEDIATE or OT_BITS32;
  420. OT_IMM64 = OT_IMMEDIATE or OT_BITS64;
  421. OT_ONENESS = otf_sub0; { special type of immediate operand }
  422. OT_UNITY = OT_IMMEDIATE or OT_ONENESS; { for shift/rotate instructions }
  423. std_op2str:op2strtable={$i ../../../compiler/x86_64/x8664int.inc}
  424. InsTab:array[0..instabentries-1] of TInsEntry={$i ../../../compiler/x86_64/x8664tab.inc}
  425. procedure BuildInsTabCache;
  426. var
  427. i : longint;
  428. begin
  429. new(instabcache);
  430. FillChar(instabcache^,sizeof(tinstabcache),$ff);
  431. i:=0;
  432. while (i<InsTabEntries) do
  433. begin
  434. if InsTabCache^[InsTab[i].OPcode]=-1 then
  435. InsTabCache^[InsTab[i].OPcode]:=i;
  436. inc(i);
  437. end;
  438. end;
  439. procedure BuildInsTabMemRefSizeInfoCache;
  440. var
  441. AsmOp: TasmOp;
  442. i,j: longint;
  443. insentry : PInsEntry;
  444. MRefInfo: TMemRefSizeInfo;
  445. SConstInfo: TConstSizeInfo;
  446. actRegSize: int64;
  447. actMemSize: int64;
  448. actConstSize: int64;
  449. actRegCount: integer;
  450. actMemCount: integer;
  451. actConstCount: integer;
  452. actRegTypes : int64;
  453. actRegMemTypes: int64;
  454. NewRegSize: int64;
  455. actVMemCount : integer;
  456. actVMemTypes : int64;
  457. RegMMXSizeMask: int64;
  458. RegXMMSizeMask: int64;
  459. RegYMMSizeMask: int64;
  460. RegZMMSizeMask: int64;
  461. RegMMXConstSizeMask: int64;
  462. RegXMMConstSizeMask: int64;
  463. RegYMMConstSizeMask: int64;
  464. RegZMMConstSizeMask: int64;
  465. RegBCSTSizeMask: int64;
  466. RegBCSTXMMSizeMask: int64;
  467. RegBCSTYMMSizeMask: int64;
  468. RegBCSTZMMSizeMask: int64;
  469. ExistsMemRef : boolean;
  470. bitcount : integer;
  471. ExistsCode336 : boolean;
  472. ExistsCode337 : boolean;
  473. ExistsSSEAVXReg : boolean;
  474. function bitcnt(aValue: int64): integer;
  475. var
  476. i: integer;
  477. begin
  478. result := 0;
  479. for i := 0 to 63 do
  480. begin
  481. if (aValue mod 2) = 1 then
  482. begin
  483. inc(result);
  484. end;
  485. aValue := aValue shr 1;
  486. end;
  487. end;
  488. begin
  489. new(InsTabMemRefSizeInfoCache);
  490. FillChar(InsTabMemRefSizeInfoCache^,sizeof(TInsTabMemRefSizeInfoCache),0);
  491. for AsmOp := low(TAsmOp) to high(TAsmOp) do
  492. begin
  493. i := InsTabCache^[AsmOp];
  494. if i >= 0 then
  495. begin
  496. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiUnknown;
  497. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbUnknown;
  498. InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 0;
  499. InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiUnknown;
  500. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := false;
  501. InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := [];
  502. insentry:=@instab[i];
  503. RegMMXSizeMask := 0;
  504. RegXMMSizeMask := 0;
  505. RegYMMSizeMask := 0;
  506. RegZMMSizeMask := 0;
  507. RegMMXConstSizeMask := 0;
  508. RegXMMConstSizeMask := 0;
  509. RegYMMConstSizeMask := 0;
  510. RegZMMConstSizeMask := 0;
  511. RegBCSTSizeMask:= 0;
  512. RegBCSTXMMSizeMask := 0;
  513. RegBCSTYMMSizeMask := 0;
  514. RegBCSTZMMSizeMask := 0;
  515. ExistsMemRef := false;
  516. while (insentry^.opcode=AsmOp) do
  517. begin
  518. MRefInfo := msiUnknown;
  519. actRegSize := 0;
  520. actRegCount := 0;
  521. actRegTypes := 0;
  522. NewRegSize := 0;
  523. actMemSize := 0;
  524. actMemCount := 0;
  525. actRegMemTypes := 0;
  526. actVMemCount := 0;
  527. actVMemTypes := 0;
  528. actConstSize := 0;
  529. actConstCount := 0;
  530. ExistsCode336 := false; // indicate fixed operand size 32 bit
  531. ExistsCode337 := false; // indicate fixed operand size 64 bit
  532. ExistsSSEAVXReg := false;
  533. // parse insentry^.code for &336 and &337
  534. // &336 (octal) = 222 (decimal) == fixed operand size 32 bit
  535. // &337 (octal) = 223 (decimal) == fixed operand size 64 bit
  536. for i := low(insentry^.code) to high(insentry^.code) do
  537. begin
  538. case insentry^.code[i] of
  539. #222: ExistsCode336 := true;
  540. #223: ExistsCode337 := true;
  541. #0,#1,#2,#3: break;
  542. end;
  543. end;
  544. for i := 0 to insentry^.ops -1 do
  545. begin
  546. if (insentry^.optypes[i] and OT_REGISTER) = OT_REGISTER then
  547. case insentry^.optypes[i] and (OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_KREG or OT_REG_EXTRA_MASK) of
  548. OT_XMMREG,
  549. OT_YMMREG,
  550. OT_ZMMREG: ExistsSSEAVXReg := true;
  551. else;
  552. end;
  553. end;
  554. for j := 0 to insentry^.ops -1 do
  555. begin
  556. if ((insentry^.optypes[j] and OT_XMEM32) = OT_XMEM32) OR
  557. ((insentry^.optypes[j] and OT_XMEM64) = OT_XMEM64) OR
  558. ((insentry^.optypes[j] and OT_YMEM32) = OT_YMEM32) OR
  559. ((insentry^.optypes[j] and OT_YMEM64) = OT_YMEM64) OR
  560. ((insentry^.optypes[j] and OT_ZMEM32) = OT_ZMEM32) OR
  561. ((insentry^.optypes[j] and OT_ZMEM64) = OT_ZMEM64) then
  562. begin
  563. inc(actVMemCount);
  564. case insentry^.optypes[j] and (OT_XMEM32 OR OT_XMEM64 OR OT_YMEM32 OR OT_YMEM64 OR OT_ZMEM32 OR OT_ZMEM64) of
  565. OT_XMEM32: actVMemTypes := actVMemTypes or OT_XMEM32;
  566. OT_XMEM64: actVMemTypes := actVMemTypes or OT_XMEM64;
  567. OT_YMEM32: actVMemTypes := actVMemTypes or OT_YMEM32;
  568. OT_YMEM64: actVMemTypes := actVMemTypes or OT_YMEM64;
  569. OT_ZMEM32: actVMemTypes := actVMemTypes or OT_ZMEM32;
  570. OT_ZMEM64: actVMemTypes := actVMemTypes or OT_ZMEM64;
  571. else;
  572. end;
  573. end
  574. else if (insentry^.optypes[j] and OT_REGISTER) = OT_REGISTER then
  575. begin
  576. inc(actRegCount);
  577. NewRegSize := (insentry^.optypes[j] and OT_SIZE_MASK);
  578. if NewRegSize = 0 then
  579. begin
  580. 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
  581. OT_MMXREG: begin
  582. NewRegSize := OT_BITS64;
  583. end;
  584. OT_XMMREG: begin
  585. NewRegSize := OT_BITS128;
  586. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
  587. end;
  588. OT_YMMREG: begin
  589. NewRegSize := OT_BITS256;
  590. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
  591. end;
  592. OT_ZMMREG: begin
  593. NewRegSize := OT_BITS512;
  594. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
  595. end;
  596. OT_KREG: begin
  597. InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX := true;
  598. end;
  599. else NewRegSize := not(0);
  600. end;
  601. end;
  602. actRegSize := actRegSize or NewRegSize;
  603. 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));
  604. end
  605. else if ((insentry^.optypes[j] and OT_MEMORY) <> 0) then
  606. begin
  607. inc(actMemCount);
  608. if ExistsSSEAVXReg and ExistsCode336 then
  609. actMemSize := actMemSize or OT_BITS32
  610. else if ExistsSSEAVXReg and ExistsCode337 then
  611. actMemSize := actMemSize or OT_BITS64
  612. else
  613. actMemSize:=actMemSize or (insentry^.optypes[j] and (OT_SIZE_MASK OR OT_VECTORBCST));
  614. if (insentry^.optypes[j] and OT_REGMEM) = OT_REGMEM then
  615. begin
  616. actRegMemTypes := actRegMemTypes or insentry^.optypes[j];
  617. end;
  618. end
  619. else if ((insentry^.optypes[j] and OT_IMMEDIATE) = OT_IMMEDIATE) then
  620. begin
  621. inc(actConstCount);
  622. actConstSize := actConstSize or (insentry^.optypes[j] and OT_SIZE_MASK);
  623. end
  624. end;
  625. if actConstCount > 0 then
  626. begin
  627. case actConstSize of
  628. 0: SConstInfo := csiNoSize;
  629. OT_BITS8: SConstInfo := csiMem8;
  630. OT_BITS16: SConstInfo := csiMem16;
  631. OT_BITS32: SConstInfo := csiMem32;
  632. OT_BITS64: SConstInfo := csiMem64;
  633. else SConstInfo := csiMultiple;
  634. end;
  635. if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize = csiUnknown then
  636. begin
  637. InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := SConstInfo;
  638. end
  639. else if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize <> SConstInfo then
  640. begin
  641. InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiMultiple;
  642. end;
  643. end;
  644. if actVMemCount > 0 then
  645. begin
  646. if actVMemCount = 1 then
  647. begin
  648. if actVMemTypes > 0 then
  649. begin
  650. case actVMemTypes of
  651. OT_XMEM32: MRefInfo := msiXMem32;
  652. OT_XMEM64: MRefInfo := msiXMem64;
  653. OT_YMEM32: MRefInfo := msiYMem32;
  654. OT_YMEM64: MRefInfo := msiYMem64;
  655. OT_ZMEM32: MRefInfo := msiZMem32;
  656. OT_ZMEM64: MRefInfo := msiZMem64;
  657. else;
  658. end;
  659. case actRegTypes of
  660. OT_XMMREG: case MRefInfo of
  661. msiXMem32,
  662. msiXMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS128;
  663. msiYMem32,
  664. msiYMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS256;
  665. msiZMem32,
  666. msiZMem64: RegXMMSizeMask := RegXMMSizeMask or OT_BITS512;
  667. else;
  668. end;
  669. OT_YMMREG: case MRefInfo of
  670. msiXMem32,
  671. msiXMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS128;
  672. msiYMem32,
  673. msiYMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS256;
  674. msiZMem32,
  675. msiZMem64: RegYMMSizeMask := RegYMMSizeMask or OT_BITS512;
  676. else;
  677. end;
  678. OT_ZMMREG: case MRefInfo of
  679. msiXMem32,
  680. msiXMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS128;
  681. msiYMem32,
  682. msiYMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS256;
  683. msiZMem32,
  684. msiZMem64: RegZMMSizeMask := RegZMMSizeMask or OT_BITS512;
  685. else;
  686. end;
  687. //else InternalError(777209);
  688. end;
  689. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
  690. begin
  691. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
  692. end
  693. else if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> MRefInfo then
  694. begin
  695. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize in [msiXMem32, msiXMem64, msiYMem32, msiYMem64, msiZMem32, msiZMem64] then
  696. begin
  697. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiVMemMultiple;
  698. end
  699. else if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> msiVMemMultiple then;
  700. end;
  701. end;
  702. end
  703. else;
  704. end
  705. else
  706. begin
  707. if (actMemCount=2) and ((AsmOp=A_MOVS) or (AsmOp=A_CMPS)) then actMemCount:=1;
  708. ExistsMemRef := ExistsMemRef or (actMemCount > 0);
  709. case actMemCount of
  710. 0: ; // nothing todo
  711. 1: begin
  712. MRefInfo := msiUnknown;
  713. if not(ExistsCode336 or ExistsCode337) then
  714. case actRegMemTypes and (OT_MMXRM or OT_XMMRM or OT_YMMRM or OT_ZMMRM or OT_REG_EXTRA_MASK) of
  715. OT_MMXRM: actMemSize := actMemSize or OT_BITS64;
  716. OT_XMMRM: actMemSize := actMemSize or OT_BITS128;
  717. OT_YMMRM: actMemSize := actMemSize or OT_BITS256;
  718. OT_ZMMRM: actMemSize := actMemSize or OT_BITS512;
  719. end;
  720. case actMemSize of
  721. 0: MRefInfo := msiNoSize;
  722. OT_BITS8: MRefInfo := msiMem8;
  723. OT_BITS16: MRefInfo := msiMem16;
  724. OT_BITS32: MRefInfo := msiMem32;
  725. OT_BITSB32: MRefInfo := msiBMem32;
  726. OT_BITS64: MRefInfo := msiMem64;
  727. OT_BITSB64: MRefInfo := msiBMem64;
  728. OT_BITS128: MRefInfo := msiMem128;
  729. OT_BITS256: MRefInfo := msiMem256;
  730. OT_BITS512: MRefInfo := msiMem512;
  731. OT_BITS80,
  732. OT_FAR,
  733. OT_NEAR,
  734. OT_SHORT: ; // ignore
  735. else
  736. begin
  737. bitcount := bitcnt(actMemSize);
  738. if bitcount > 1 then MRefInfo := msiMultiple
  739. else;
  740. end;
  741. end;
  742. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
  743. begin
  744. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
  745. end
  746. else
  747. begin
  748. // ignore broadcast-memory
  749. if not(MRefInfo in [msiBMem32, msiBMem64]) then
  750. begin
  751. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize <> MRefInfo then
  752. begin
  753. with InsTabMemRefSizeInfoCache^[AsmOp] do
  754. begin
  755. if ((MemRefSize in [msiMem8, msiMULTIPLEMinSize8]) OR (MRefInfo = msiMem8)) then MemRefSize := msiMultipleMinSize8
  756. else if ((MemRefSize in [ msiMem16, msiMULTIPLEMinSize16]) OR (MRefInfo = msiMem16)) then MemRefSize := msiMultipleMinSize16
  757. else if ((MemRefSize in [ msiMem32, msiMULTIPLEMinSize32]) OR (MRefInfo = msiMem32)) then MemRefSize := msiMultipleMinSize32
  758. else if ((MemRefSize in [ msiMem64, msiMULTIPLEMinSize64]) OR (MRefInfo = msiMem64)) then MemRefSize := msiMultipleMinSize64
  759. else if ((MemRefSize in [msiMem128, msiMULTIPLEMinSize128]) OR (MRefInfo = msiMem128)) then MemRefSize := msiMultipleMinSize128
  760. else if ((MemRefSize in [msiMem256, msiMULTIPLEMinSize256]) OR (MRefInfo = msiMem256)) then MemRefSize := msiMultipleMinSize256
  761. else if ((MemRefSize in [msiMem512, msiMULTIPLEMinSize512]) OR (MRefInfo = msiMem512)) then MemRefSize := msiMultipleMinSize512
  762. else MemRefSize := msiMultiple;
  763. end;
  764. end;
  765. end;
  766. end;
  767. //if not(MRefInfo in [msiBMem32, msiBMem64]) and (actRegCount > 0) then
  768. if actRegCount > 0 then
  769. begin
  770. if MRefInfo in [msiBMem32, msiBMem64] then
  771. begin
  772. if IF_BCST2 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to2];
  773. if IF_BCST4 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to4];
  774. if IF_BCST8 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to8];
  775. if IF_BCST16 in insentry^.flags then InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes := InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes + [bt1to16];
  776. //InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes
  777. // BROADCAST - OPERAND
  778. RegBCSTSizeMask := RegBCSTSizeMask or actMemSize;
  779. case actRegTypes and (OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_REG_EXTRA_MASK) of
  780. OT_XMMREG: RegBCSTXMMSizeMask := RegBCSTXMMSizeMask or actMemSize;
  781. OT_YMMREG: RegBCSTYMMSizeMask := RegBCSTYMMSizeMask or actMemSize;
  782. OT_ZMMREG: RegBCSTZMMSizeMask := RegBCSTZMMSizeMask or actMemSize;
  783. else begin
  784. RegBCSTXMMSizeMask := not(0);
  785. RegBCSTYMMSizeMask := not(0);
  786. RegBCSTZMMSizeMask := not(0);
  787. end;
  788. end;
  789. end
  790. else
  791. case actRegTypes and (OT_MMXREG or OT_XMMREG or OT_YMMREG or OT_ZMMREG or OT_REG_EXTRA_MASK) of
  792. OT_MMXREG: if actConstCount > 0 then RegMMXConstSizeMask := RegMMXConstSizeMask or actMemSize
  793. else RegMMXSizeMask := RegMMXSizeMask or actMemSize;
  794. OT_XMMREG: if actConstCount > 0 then RegXMMConstSizeMask := RegXMMConstSizeMask or actMemSize
  795. else RegXMMSizeMask := RegXMMSizeMask or actMemSize;
  796. OT_YMMREG: if actConstCount > 0 then RegYMMConstSizeMask := RegYMMConstSizeMask or actMemSize
  797. else RegYMMSizeMask := RegYMMSizeMask or actMemSize;
  798. OT_ZMMREG: if actConstCount > 0 then RegZMMConstSizeMask := RegZMMConstSizeMask or actMemSize
  799. else RegZMMSizeMask := RegZMMSizeMask or actMemSize;
  800. else begin
  801. RegMMXSizeMask := not(0);
  802. RegXMMSizeMask := not(0);
  803. RegYMMSizeMask := not(0);
  804. RegZMMSizeMask := not(0);
  805. RegMMXConstSizeMask := not(0);
  806. RegXMMConstSizeMask := not(0);
  807. RegYMMConstSizeMask := not(0);
  808. RegZMMConstSizeMask := not(0);
  809. end;
  810. end;
  811. end
  812. else
  813. end
  814. else;
  815. end;
  816. end;
  817. inc(insentry);
  818. end;
  819. if InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX then
  820. begin
  821. case RegBCSTSizeMask of
  822. 0: ; // ignore;
  823. OT_BITSB32: begin
  824. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbBCST32;
  825. InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 4;
  826. end;
  827. OT_BITSB64: begin
  828. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbBCST64;
  829. InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 2;
  830. end;
  831. else begin
  832. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST := msbMultiple;
  833. end;
  834. end;
  835. end;
  836. if (InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize in MemRefMultiples) and
  837. (InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX)then
  838. begin
  839. if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiVMemMultiple then
  840. begin
  841. if ((RegXMMSizeMask = OT_BITS128) or (RegXMMSizeMask = 0)) and
  842. ((RegYMMSizeMask = OT_BITS256) or (RegYMMSizeMask = 0)) and
  843. ((RegZMMSizeMask = OT_BITS512) or (RegZMMSizeMask = 0)) and
  844. ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) <> 0) then
  845. begin
  846. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiVMemRegSize;
  847. end;
  848. end
  849. else if (RegMMXSizeMask or RegMMXConstSizeMask) <> 0 then
  850. begin
  851. if ((RegMMXSizeMask or RegMMXConstSizeMask) = OT_BITS64) and
  852. ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS128) and
  853. ((RegYMMSizeMask or RegYMMConstSizeMask) = 0) and
  854. ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
  855. begin
  856. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegSize;
  857. end;
  858. end
  859. else if (((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS128) or ((RegXMMSizeMask or RegXMMConstSizeMask) = 0)) and
  860. (((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) or ((RegYMMSizeMask or RegYMMConstSizeMask) = 0)) and
  861. (((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS512) or ((RegZMMSizeMask or RegZMMConstSizeMask) = 0)) and
  862. (((RegXMMSizeMask or RegXMMConstSizeMask or
  863. RegYMMSizeMask or RegYMMConstSizeMask or
  864. RegZMMSizeMask or RegZMMConstSizeMask)) <> 0) then
  865. begin
  866. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegSize;
  867. end
  868. else if (RegXMMSizeMask or RegXMMConstSizeMask = OT_BITS16) and
  869. (RegYMMSizeMask or RegYMMConstSizeMask = OT_BITS32) and
  870. (RegZMMSizeMask or RegZMMConstSizeMask = 0) then
  871. begin
  872. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx16y32;
  873. end
  874. else if (RegXMMSizeMask or RegXMMConstSizeMask = OT_BITS16) and
  875. (RegYMMSizeMask or RegYMMConstSizeMask = OT_BITS32) and
  876. (RegZMMSizeMask or RegZMMConstSizeMask = OT_BITS64) then
  877. begin
  878. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx16y32z64;
  879. end
  880. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS32) and
  881. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS64) then
  882. begin
  883. if ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
  884. begin
  885. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx32y64;
  886. end
  887. else if ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS128) then
  888. begin
  889. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx32y64z128;
  890. end;
  891. end
  892. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
  893. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS128) and
  894. ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
  895. begin
  896. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y128;
  897. end
  898. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
  899. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS128) and
  900. ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS256) then
  901. begin
  902. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y128z256;
  903. end
  904. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
  905. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) and
  906. ((RegZMMSizeMask or RegZMMConstSizeMask) = 0) then
  907. begin
  908. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y256;
  909. end
  910. else if ((RegXMMSizeMask or RegXMMConstSizeMask) = OT_BITS64) and
  911. ((RegYMMSizeMask or RegYMMConstSizeMask) = OT_BITS256) and
  912. ((RegZMMSizeMask or RegZMMConstSizeMask) = OT_BITS512) then
  913. begin
  914. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegx64y256z512;
  915. end
  916. else if ((RegXMMConstSizeMask = 0) or (RegXMMConstSizeMask = OT_BITS128)) and
  917. ((RegYMMConstSizeMask = 0) or (RegYMMConstSizeMask = OT_BITS256)) and
  918. ((RegZMMConstSizeMask = 0) or (RegZMMConstSizeMask = OT_BITS512)) and
  919. ((RegXMMConstSizeMask or RegYMMConstSizeMask or RegZMMConstSizeMask) <> 0) and
  920. (
  921. ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS128) or
  922. ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS256) or
  923. ((RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask) = OT_BITS512)
  924. ) then
  925. begin
  926. case RegXMMSizeMask or RegYMMSizeMask or RegZMMSizeMask of
  927. OT_BITS128: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst128;
  928. OT_BITS256: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst256;
  929. OT_BITS512: InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMemRegConst512;
  930. else InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiMultiple;
  931. end;
  932. end
  933. else
  934. begin
  935. if not(
  936. (AsmOp = A_CVTSI2SS) or
  937. (AsmOp = A_CVTSI2SD) or
  938. (AsmOp = A_CVTPD2DQ) or
  939. (AsmOp = A_VCVTPD2DQ) or
  940. (AsmOp = A_VCVTPD2PS) or
  941. (AsmOp = A_VCVTSI2SD) or
  942. (AsmOp = A_VCVTSI2SS) or
  943. (AsmOp = A_VCVTTPD2DQ) or
  944. (AsmOp = A_VCVTPD2UDQ) or
  945. (AsmOp = A_VCVTQQ2PS) or
  946. (AsmOp = A_VCVTTPD2UDQ) or
  947. (AsmOp = A_VCVTUQQ2PS) or
  948. (AsmOp = A_VCVTUSI2SD) or
  949. (AsmOp = A_VCVTUSI2SS) or
  950. // TODO check
  951. (AsmOp = A_VCMPSS)
  952. ) then;
  953. end;
  954. end
  955. else if (InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) and
  956. (InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown) and
  957. (not(ExistsMemRef)) then
  958. begin
  959. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiNoMemRef;
  960. end;
  961. InsTabMemRefSizeInfoCache^[AsmOp].RegXMMSizeMask:=RegXMMSizeMask;
  962. InsTabMemRefSizeInfoCache^[AsmOp].RegYMMSizeMask:=RegYMMSizeMask;
  963. InsTabMemRefSizeInfoCache^[AsmOp].RegZMMSizeMask:=RegZMMSizeMask;
  964. end;
  965. end;
  966. for AsmOp := low(TAsmOp) to high(TAsmOp) do
  967. begin
  968. // only supported intructiones with SSE- or AVX-operands
  969. if not(InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) then
  970. begin
  971. InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiUnknown;
  972. InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := csiUnknown;
  973. end;
  974. end;
  975. end;
  976. { TOperandListItem }
  977. constructor TOperandListItem.Create;
  978. begin
  979. inherited;
  980. FOpActive := false;
  981. FOpNumber := -1;
  982. FOpTyp := otUnknown;
  983. FValues := TStringList.Create;
  984. end;
  985. destructor TOperandListItem.Destroy;
  986. begin
  987. FreeAndNil(FValues);
  988. inherited;
  989. end;
  990. { TOperandList }
  991. function TOperandList.Add(aItem: TOperandListItem): integer;
  992. begin
  993. result := FList.Add(aItem);
  994. end;
  995. function TOperandList.GetItems(aIndex: integer): TOperandListItem;
  996. begin
  997. result := TOperandListItem(FList[aIndex]);
  998. end;
  999. { TAsmTestGenerator }
  1000. function TAsmTestGenerator.InternalCalcTestData(const aInst, aOp1, aOp2, aOp3,
  1001. aOp4: String): TStringList;
  1002. var
  1003. i: integer;
  1004. Item: TOperandListItem;
  1005. OItem1: TOperandListItem;
  1006. OItem2: TOperandListItem;
  1007. OItem3: TOperandListItem;
  1008. OItem4: TOperandListItem;
  1009. il_Op: integer;
  1010. il_Op1: integer;
  1011. il_Op2: integer;
  1012. il_Op3: integer;
  1013. il_Op4: integer;
  1014. sSuffix: string;
  1015. sl_Operand: String;
  1016. sl_Inst : String;
  1017. sl_RegCombi: String;
  1018. sl_Prefix: String;
  1019. UsePrefix: boolean;
  1020. il_Operands: integer;
  1021. UsedParams: cardinal;
  1022. UseDefault: boolean;
  1023. sl_RegCombi1: string;
  1024. sl_RegCombi2: string;
  1025. sl_RegCombi3: string;
  1026. MaskRegNeeded:boolean;
  1027. function PrepareOperandTyp(const aTyp: String): String;
  1028. begin
  1029. result := aTyp;
  1030. if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
  1031. if result = 'XMMRM128' then result := 'XMMRM';
  1032. if result = 'YMMRM256' then result := 'YMMRM';
  1033. end;
  1034. begin
  1035. result := TStringList.Create;
  1036. OItem1 := TOperandListItem.Create;
  1037. try
  1038. OItem2 := TOperandListItem.Create;
  1039. try
  1040. OItem3 := TOperandListItem.Create;
  1041. try
  1042. OItem4 := TOperandListItem.Create;
  1043. try
  1044. UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
  1045. (UpperCase(aInst) = 'VCVTPD2PS') OR
  1046. (UpperCase(aInst) = 'VCVTSI2SD') OR
  1047. (UpperCase(aInst) = 'VCVTSI2SS') OR
  1048. (UpperCase(aInst) = 'VCVTTPD2DQ') or
  1049. (UpperCase(aInst) = 'VPMOVZXWQ') or
  1050. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  1051. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  1052. (UpperCase(aInst) = 'VCVTTPD2UDQ') or
  1053. (UpperCase(aInst) = 'VCVTUQQ2PS') or
  1054. (UpperCase(aInst) = 'VCVTQQ2PS') or
  1055. (UpperCase(aInst) = 'VCVTUSI2SD') or
  1056. (UpperCase(aInst) = 'VCVTUSI2SS') or
  1057. (UpperCase(aInst) = 'VFPCLASSPD') or
  1058. (UpperCase(aInst) = 'VFPCLASSPS') or
  1059. (UpperCase(aInst) = 'VCMPSS')
  1060. ;
  1061. MaskRegNeeded := (Pos('VGATHER', Uppercase(aInst)) = 1) or
  1062. (Pos('VPGATHER', Uppercase(aInst)) = 1) or
  1063. (Pos('VPSCATTER', Uppercase(aInst)) = 1) or
  1064. (Pos('VSCATTER', Uppercase(aInst)) = 1);
  1065. for il_Op := 1 to 4 do
  1066. begin
  1067. sl_Prefix := '';
  1068. case il_Op of
  1069. 1: begin
  1070. Item := OItem1;
  1071. sl_Operand := aOp1;
  1072. end;
  1073. 2: begin
  1074. Item := OItem2;
  1075. sl_Operand := aOp2;
  1076. end;
  1077. 3: begin
  1078. Item := OItem3;
  1079. sl_Operand := aOp3;
  1080. end;
  1081. 4: begin
  1082. Item := OItem4;
  1083. sl_Operand := aOp4;
  1084. end;
  1085. end;
  1086. sl_Operand := PrepareOperandTyp(sl_Operand);
  1087. if (AnsiSameText(sl_Operand, 'XMMREG')) or
  1088. (AnsiSameText(sl_Operand, 'XMMREG_M')) or
  1089. (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
  1090. (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
  1091. (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
  1092. begin
  1093. Item.OpNumber := il_Op;
  1094. Item.OpTyp := otXMMReg;
  1095. Item.OpActive := true;
  1096. sSuffix := '';
  1097. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1098. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1099. if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
  1100. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1101. Item.Values.Add('XMM0' + sSuffix);
  1102. Item.Values.Add('XMM1' + sSuffix);
  1103. Item.Values.Add('XMM2' + sSuffix);
  1104. Item.Values.Add('XMM3' + sSuffix);
  1105. Item.Values.Add('XMM4' + sSuffix);
  1106. Item.Values.Add('XMM5' + sSuffix);
  1107. Item.Values.Add('XMM6' + sSuffix);
  1108. Item.Values.Add('XMM7' + sSuffix);
  1109. if x64 then
  1110. begin
  1111. Item.Values.Clear;
  1112. if FAVX512 then
  1113. begin
  1114. Item.Values.Add('XMM0' + sSuffix);
  1115. Item.Values.Add('XMM9' + sSuffix);
  1116. Item.Values.Add('XMM18' + sSuffix);
  1117. Item.Values.Add('XMM27' + sSuffix);
  1118. Item.Values.Add('XMM31' + sSuffix);
  1119. if (sSuffix <> '') and
  1120. (MaskRegNeeded = false) then
  1121. begin
  1122. Item.Values.Add('XMM0');
  1123. Item.Values.Add('XMM9');
  1124. Item.Values.Add('XMM18');
  1125. Item.Values.Add('XMM27');
  1126. Item.Values.Add('XMM31');
  1127. end;
  1128. end
  1129. else
  1130. begin
  1131. Item.Values.Add('XMM0' + sSuffix);
  1132. Item.Values.Add('XMM4' + sSuffix);
  1133. Item.Values.Add('XMM8' + sSuffix);
  1134. Item.Values.Add('XMM12' + sSuffix);
  1135. Item.Values.Add('XMM15' + sSuffix);
  1136. if (sSuffix <> '') and
  1137. (MaskRegNeeded = false) then
  1138. begin
  1139. Item.Values.Add('XMM0');
  1140. Item.Values.Add('XMM4');
  1141. Item.Values.Add('XMM8');
  1142. Item.Values.Add('XMM12');
  1143. Item.Values.Add('XMM15');
  1144. end;
  1145. end;
  1146. end;
  1147. end
  1148. else if (AnsiSameText(sl_Operand, 'XMMRM')) or
  1149. (AnsiSameText(sl_Operand, 'XMMRM_M')) or
  1150. (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
  1151. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  1152. (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
  1153. begin
  1154. Item.OpNumber := il_Op;
  1155. Item.OpTyp := otXMMRM;
  1156. Item.OpActive := true;
  1157. if UsePrefix then sl_Prefix := 'oword ';
  1158. sSuffix := '';
  1159. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1160. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1161. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1162. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1163. Item.Values.Add('XMM0' + sSuffix);
  1164. Item.Values.Add('XMM1' + sSuffix);
  1165. Item.Values.Add('XMM2' + sSuffix);
  1166. Item.Values.Add('XMM3' + sSuffix);
  1167. Item.Values.Add('XMM4' + sSuffix);
  1168. Item.Values.Add('XMM5' + sSuffix);
  1169. Item.Values.Add('XMM6' + sSuffix);
  1170. Item.Values.Add('XMM7' + sSuffix);
  1171. if x64 then
  1172. begin
  1173. Item.Values.Clear;
  1174. if FAVX512 then
  1175. begin
  1176. Item.Values.Add('XMM0' + sSuffix);
  1177. Item.Values.Add('XMM0');
  1178. Item.Values.Add('XMM9' + sSuffix);
  1179. Item.Values.Add('XMM9');
  1180. Item.Values.Add('XMM18' + sSuffix);
  1181. Item.Values.Add('XMM18');
  1182. Item.Values.Add('XMM27' + sSuffix);
  1183. Item.Values.Add('XMM27');
  1184. Item.Values.Add('XMM31' + sSuffix);
  1185. Item.Values.Add('XMM31');
  1186. end
  1187. else
  1188. begin
  1189. Item.Values.Add('XMM0' + sSuffix);
  1190. Item.Values.Add('XMM0');
  1191. Item.Values.Add('XMM4' + sSuffix);
  1192. Item.Values.Add('XMM4');
  1193. Item.Values.Add('XMM8' + sSuffix);
  1194. Item.Values.Add('XMM8');
  1195. Item.Values.Add('XMM12' + sSuffix);
  1196. Item.Values.Add('XMM15');
  1197. Item.Values.Add('XMM15' + sSuffix);
  1198. end;
  1199. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1200. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1201. end
  1202. else
  1203. begin
  1204. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  1205. end;
  1206. end
  1207. else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
  1208. (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
  1209. (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
  1210. (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
  1211. (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
  1212. begin
  1213. Item.OpNumber := il_Op;
  1214. Item.OpTyp := otXMMRM8;
  1215. Item.OpActive := true;
  1216. if UsePrefix then sl_Prefix := 'byte ';
  1217. sSuffix := '';
  1218. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1219. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1220. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1221. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1222. Item.Values.Add('XMM0' + sSuffix);
  1223. Item.Values.Add('XMM1' + sSuffix);
  1224. Item.Values.Add('XMM2' + sSuffix);
  1225. Item.Values.Add('XMM3' + sSuffix);
  1226. Item.Values.Add('XMM4' + sSuffix);
  1227. Item.Values.Add('XMM5' + sSuffix);
  1228. Item.Values.Add('XMM6' + sSuffix);
  1229. Item.Values.Add('XMM7' + sSuffix);
  1230. if x64 then
  1231. begin
  1232. Item.Values.Clear;
  1233. if FAVX512 then
  1234. begin
  1235. Item.Values.Add('XMM0' + sSuffix);
  1236. Item.Values.Add('XMM0');
  1237. Item.Values.Add('XMM9' + sSuffix);
  1238. Item.Values.Add('XMM9');
  1239. Item.Values.Add('XMM18' + sSuffix);
  1240. Item.Values.Add('XMM18');
  1241. Item.Values.Add('XMM27' + sSuffix);
  1242. Item.Values.Add('XMM27');
  1243. Item.Values.Add('XMM31' + sSuffix);
  1244. Item.Values.Add('XMM31');
  1245. end
  1246. else
  1247. begin
  1248. Item.Values.Add('XMM0' + sSuffix);
  1249. Item.Values.Add('XMM0');
  1250. Item.Values.Add('XMM4' + sSuffix);
  1251. Item.Values.Add('XMM4');
  1252. Item.Values.Add('XMM8' + sSuffix);
  1253. Item.Values.Add('XMM8');
  1254. Item.Values.Add('XMM12' + sSuffix);
  1255. Item.Values.Add('XMM12');
  1256. Item.Values.Add('XMM15' + sSuffix);
  1257. Item.Values.Add('XMM15');
  1258. end;
  1259. //Item.Values.Add('[RIP]');
  1260. //Item.Values.Add('[RIP + 16]');
  1261. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1262. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1263. end
  1264. else
  1265. begin
  1266. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  1267. end;
  1268. end
  1269. else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
  1270. (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
  1271. (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
  1272. (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
  1273. (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
  1274. then
  1275. begin
  1276. Item.OpNumber := il_Op;
  1277. Item.OpTyp := otXMMRM16;
  1278. Item.OpActive := true;
  1279. if UsePrefix then sl_Prefix := 'word ';
  1280. sSuffix := '';
  1281. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1282. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1283. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1284. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1285. Item.Values.Add('XMM0' + sSuffix);
  1286. Item.Values.Add('XMM1' + sSuffix);
  1287. Item.Values.Add('XMM2' + sSuffix);
  1288. Item.Values.Add('XMM3' + sSuffix);
  1289. Item.Values.Add('XMM4' + sSuffix);
  1290. Item.Values.Add('XMM5' + sSuffix);
  1291. Item.Values.Add('XMM6' + sSuffix);
  1292. Item.Values.Add('XMM7' + sSuffix);
  1293. if x64 then
  1294. begin
  1295. Item.Values.Clear;
  1296. if FAVX512 then
  1297. begin
  1298. Item.Values.Add('XMM0' + sSuffix);
  1299. Item.Values.Add('XMM0');
  1300. Item.Values.Add('XMM9' + sSuffix);
  1301. Item.Values.Add('XMM9');
  1302. Item.Values.Add('XMM18' + sSuffix);
  1303. Item.Values.Add('XMM18');
  1304. Item.Values.Add('XMM27' + sSuffix);
  1305. Item.Values.Add('XMM27');
  1306. Item.Values.Add('XMM31' + sSuffix);
  1307. Item.Values.Add('XMM31');
  1308. end
  1309. else
  1310. begin
  1311. Item.Values.Add('XMM0' + sSuffix);
  1312. Item.Values.Add('XMM0');
  1313. Item.Values.Add('XMM4' + sSuffix);
  1314. Item.Values.Add('XMM4');
  1315. Item.Values.Add('XMM8' + sSuffix);
  1316. Item.Values.Add('XMM8');
  1317. Item.Values.Add('XMM12' + sSuffix);
  1318. Item.Values.Add('XMM12');
  1319. Item.Values.Add('XMM15' + sSuffix);
  1320. Item.Values.Add('XMM15');
  1321. end;
  1322. //Item.Values.Add('[RIP]');
  1323. //Item.Values.Add('[RIP + 16]');
  1324. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  1325. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1326. end
  1327. else
  1328. begin
  1329. MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1330. end;
  1331. end
  1332. else if (AnsiSameText(sl_Operand, 'YMMREG')) or
  1333. (AnsiSameText(sl_Operand, 'YMMREG_M')) or
  1334. (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
  1335. (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
  1336. (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
  1337. then
  1338. begin
  1339. Item.OpNumber := il_Op;
  1340. Item.OpTyp := otYMMReg;
  1341. Item.OpActive := true;
  1342. sSuffix := '';
  1343. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1344. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1345. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1346. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1347. Item.Values.Add('YMM0' + sSuffix);
  1348. Item.Values.Add('YMM1' + sSuffix);
  1349. Item.Values.Add('YMM2' + sSuffix);
  1350. Item.Values.Add('YMM3' + sSuffix);
  1351. Item.Values.Add('YMM4' + sSuffix);
  1352. Item.Values.Add('YMM5' + sSuffix);
  1353. Item.Values.Add('YMM6' + sSuffix);
  1354. Item.Values.Add('YMM7' + sSuffix);
  1355. if x64 then
  1356. begin
  1357. Item.Values.Clear;
  1358. if FAVX512 then
  1359. begin
  1360. Item.Values.Add('YMM0' + sSuffix);
  1361. Item.Values.Add('YMM9' + sSuffix);
  1362. Item.Values.Add('YMM18' + sSuffix);
  1363. Item.Values.Add('YMM27' + sSuffix);
  1364. Item.Values.Add('YMM31' + sSuffix);
  1365. if (sSuffix <> '') and
  1366. (MaskRegNeeded = false) then
  1367. begin
  1368. Item.Values.Add('YMM0');
  1369. Item.Values.Add('YMM9');
  1370. Item.Values.Add('YMM18');
  1371. Item.Values.Add('YMM27');
  1372. Item.Values.Add('YMM31');
  1373. end;
  1374. end
  1375. else
  1376. begin
  1377. Item.Values.Add('YMM0' + sSuffix);
  1378. Item.Values.Add('YMM4' + sSuffix);
  1379. Item.Values.Add('YMM8' + sSuffix);
  1380. Item.Values.Add('YMM12' + sSuffix);
  1381. Item.Values.Add('YMM15' + sSuffix);
  1382. if (sSuffix <> '') and
  1383. (MaskRegNeeded = false) then
  1384. begin
  1385. Item.Values.Add('YMM0');
  1386. Item.Values.Add('YMM4');
  1387. Item.Values.Add('YMM8');
  1388. Item.Values.Add('YMM12');
  1389. Item.Values.Add('YMM15');
  1390. end;
  1391. end;
  1392. end;
  1393. end
  1394. else if (AnsiSameText(sl_Operand, 'YMMRM')) or
  1395. (AnsiSameText(sl_Operand, 'YMMRM_M')) or
  1396. (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
  1397. (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
  1398. (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
  1399. then
  1400. begin
  1401. Item.OpNumber := il_Op;
  1402. Item.OpTyp := otYMMRM;
  1403. Item.OpActive := true;
  1404. if UsePrefix then sl_Prefix := 'yword ';
  1405. sSuffix := '';
  1406. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1407. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1408. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1409. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1410. Item.Values.Add('YMM0' + sSuffix);
  1411. Item.Values.Add('YMM1' + sSuffix);
  1412. Item.Values.Add('YMM2' + sSuffix);
  1413. Item.Values.Add('YMM3' + sSuffix);
  1414. Item.Values.Add('YMM4' + sSuffix);
  1415. Item.Values.Add('YMM5' + sSuffix);
  1416. Item.Values.Add('YMM6' + sSuffix);
  1417. Item.Values.Add('YMM7' + sSuffix);
  1418. if x64 then
  1419. begin
  1420. Item.Values.Clear;
  1421. if FAVX512 then
  1422. begin
  1423. Item.Values.Add('YMM0' + sSuffix);
  1424. Item.Values.Add('YMM9' + sSuffix);
  1425. Item.Values.Add('YMM18' + sSuffix);
  1426. Item.Values.Add('YMM27' + sSuffix);
  1427. Item.Values.Add('YMM31' + sSuffix);
  1428. if (sSuffix <> '') and
  1429. (MaskRegNeeded = false) then
  1430. begin
  1431. Item.Values.Add('YMM0');
  1432. Item.Values.Add('YMM9');
  1433. Item.Values.Add('YMM18');
  1434. Item.Values.Add('YMM27');
  1435. Item.Values.Add('YMM31');
  1436. end;
  1437. end
  1438. else
  1439. begin
  1440. Item.Values.Add('YMM0' + sSuffix);
  1441. Item.Values.Add('YMM4' + sSuffix);
  1442. Item.Values.Add('YMM8' + sSuffix);
  1443. Item.Values.Add('YMM12' + sSuffix);
  1444. Item.Values.Add('YMM15' + sSuffix);
  1445. if (sSuffix <> '') and
  1446. (MaskRegNeeded = false) then
  1447. begin
  1448. Item.Values.Add('YMM0');
  1449. Item.Values.Add('YMM4');
  1450. Item.Values.Add('YMM8');
  1451. Item.Values.Add('YMM12');
  1452. Item.Values.Add('YMM15');
  1453. end;
  1454. end;
  1455. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  1456. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1457. end
  1458. else
  1459. begin
  1460. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  1461. end;
  1462. end
  1463. else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
  1464. (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
  1465. (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
  1466. (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
  1467. (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
  1468. then
  1469. begin
  1470. Item.OpNumber := il_Op;
  1471. Item.OpTyp := otZMMReg;
  1472. Item.OpActive := true;
  1473. sSuffix := '';
  1474. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1475. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1476. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1477. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1478. Item.Values.Add('ZMM0' + sSuffix);
  1479. Item.Values.Add('ZMM1' + sSuffix);
  1480. Item.Values.Add('ZMM2' + sSuffix);
  1481. Item.Values.Add('ZMM3' + sSuffix);
  1482. Item.Values.Add('ZMM4' + sSuffix);
  1483. Item.Values.Add('ZMM5' + sSuffix);
  1484. Item.Values.Add('ZMM6' + sSuffix);
  1485. Item.Values.Add('ZMM7' + sSuffix);
  1486. if x64 then
  1487. begin
  1488. Item.Values.Clear;
  1489. if FAVX512 then
  1490. begin
  1491. Item.Values.Add('ZMM0' + sSuffix);
  1492. Item.Values.Add('ZMM9' + sSuffix);
  1493. Item.Values.Add('ZMM18' + sSuffix);
  1494. Item.Values.Add('ZMM27' + sSuffix);
  1495. Item.Values.Add('ZMM31' + sSuffix);
  1496. if (sSuffix <> '') and
  1497. (MaskRegNeeded = false) then
  1498. begin
  1499. Item.Values.Add('ZMM0');
  1500. Item.Values.Add('ZMM9');
  1501. Item.Values.Add('ZMM18');
  1502. Item.Values.Add('ZMM27');
  1503. Item.Values.Add('ZMM31');
  1504. end;
  1505. end
  1506. else
  1507. begin
  1508. Item.Values.Add('ZMM0' + sSuffix);
  1509. Item.Values.Add('ZMM4' + sSuffix);
  1510. Item.Values.Add('ZMM8' + sSuffix);
  1511. Item.Values.Add('ZMM12' + sSuffix);
  1512. Item.Values.Add('ZMM15' + sSuffix);
  1513. end;
  1514. end;
  1515. end
  1516. else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
  1517. (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
  1518. (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
  1519. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  1520. (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
  1521. then
  1522. begin
  1523. Item.OpNumber := il_Op;
  1524. Item.OpTyp := otZMMRM;
  1525. Item.OpActive := true;
  1526. if UsePrefix then sl_Prefix := 'zword ';
  1527. sSuffix := '';
  1528. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  1529. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1530. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  1531. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  1532. Item.Values.Add('ZMM0' + sSuffix);
  1533. Item.Values.Add('ZMM1' + sSuffix);
  1534. Item.Values.Add('ZMM2' + sSuffix);
  1535. Item.Values.Add('ZMM3' + sSuffix);
  1536. Item.Values.Add('ZMM4' + sSuffix);
  1537. Item.Values.Add('ZMM5' + sSuffix);
  1538. Item.Values.Add('ZMM6' + sSuffix);
  1539. Item.Values.Add('ZMM7' + sSuffix);
  1540. if x64 then
  1541. begin
  1542. Item.Values.Clear;
  1543. if FAVX512 then
  1544. begin
  1545. Item.Values.Add('ZMM0' + sSuffix);
  1546. Item.Values.Add('ZMM9' + sSuffix);
  1547. Item.Values.Add('ZMM18' + sSuffix);
  1548. Item.Values.Add('ZMM27' + sSuffix);
  1549. Item.Values.Add('ZMM31' + sSuffix);
  1550. if (sSuffix <> '') and
  1551. (MaskRegNeeded = false) then
  1552. begin
  1553. Item.Values.Add('ZMM0');
  1554. Item.Values.Add('ZMM9');
  1555. Item.Values.Add('ZMM18');
  1556. Item.Values.Add('ZMM27');
  1557. Item.Values.Add('ZMM31');
  1558. end;
  1559. end
  1560. else
  1561. begin
  1562. Item.Values.Add('ZMM0' + sSuffix);
  1563. Item.Values.Add('ZMM4' + sSuffix);
  1564. Item.Values.Add('ZMM8' + sSuffix);
  1565. Item.Values.Add('ZMM12' + sSuffix);
  1566. Item.Values.Add('ZMM15' + sSuffix);
  1567. end;
  1568. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  1569. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1570. end
  1571. else
  1572. begin
  1573. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  1574. end;
  1575. end
  1576. else if AnsiSameText(sl_Operand, 'MEM8') then
  1577. begin
  1578. Item.OpNumber := il_Op;
  1579. Item.OpTyp := otMEM8;
  1580. Item.OpActive := true;
  1581. if UsePrefix then sl_Prefix := 'byte ';
  1582. sSuffix := '';
  1583. if x64 then
  1584. begin
  1585. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1586. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1587. end
  1588. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1589. end
  1590. else if AnsiSameText(sl_Operand, 'MEM16') or
  1591. AnsiSameText(sl_Operand, 'MEM16_M') then
  1592. begin
  1593. Item.OpNumber := il_Op;
  1594. Item.OpTyp := otMEM16;
  1595. Item.OpActive := true;
  1596. if UsePrefix then sl_Prefix := 'word ';
  1597. sSuffix := '';
  1598. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1599. if x64 then
  1600. begin
  1601. MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1602. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1603. end
  1604. else MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1605. end
  1606. else if AnsiSameText(sl_Operand, 'MEM32') or
  1607. AnsiSameText(sl_Operand, 'MEM32_M') or
  1608. AnsiSameText(sl_Operand, 'MEM32_MZ') then
  1609. begin
  1610. Item.OpNumber := il_Op;
  1611. Item.OpTyp := otMEM32;
  1612. Item.OpActive := true;
  1613. if UsePrefix then sl_Prefix := 'dword ';
  1614. sSuffix := '';
  1615. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1616. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1617. if x64 then
  1618. begin
  1619. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1620. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1621. end
  1622. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1623. end
  1624. else if (AnsiSameText(sl_Operand, 'MEM64')) or
  1625. (AnsiSameText(sl_Operand, 'MEM64_M')) or
  1626. (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
  1627. begin
  1628. Item.OpNumber := il_Op;
  1629. Item.OpTyp := otMEM64;
  1630. Item.OpActive := true;
  1631. if UsePrefix then sl_Prefix := 'qword ';
  1632. sSuffix := '';
  1633. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1634. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1635. if x64 then
  1636. begin
  1637. MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1638. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1639. end
  1640. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1641. end
  1642. else if (AnsiSameText(sl_Operand, 'MEM128')) or
  1643. (AnsiSameText(sl_Operand, 'MEM128_M')) or
  1644. (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
  1645. begin
  1646. Item.OpNumber := il_Op;
  1647. Item.OpTyp := otMEM128;
  1648. Item.OpActive := true;
  1649. if UsePrefix then sl_Prefix := 'oword ';
  1650. sSuffix := '';
  1651. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1652. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1653. if x64 then
  1654. begin
  1655. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1656. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1657. end
  1658. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1659. end
  1660. else if (AnsiSameText(sl_Operand, 'MEM256')) or
  1661. (AnsiSameText(sl_Operand, 'MEM256_M')) or
  1662. (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
  1663. begin
  1664. Item.OpNumber := il_Op;
  1665. Item.OpTyp := otMEM256;
  1666. Item.OpActive := true;
  1667. if UsePrefix then sl_Prefix := 'yword ';
  1668. sSuffix := '';
  1669. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1670. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1671. if x64 then
  1672. begin
  1673. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1674. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1675. end
  1676. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1677. end
  1678. else if (AnsiSameText(sl_Operand, 'MEM512')) or
  1679. (AnsiSameText(sl_Operand, 'MEM512_M')) or
  1680. (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
  1681. begin
  1682. Item.OpNumber := il_Op;
  1683. Item.OpTyp := otMEM512;
  1684. Item.OpActive := true;
  1685. if UsePrefix then sl_Prefix := 'zword ';
  1686. sSuffix := '';
  1687. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1688. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1689. if x64 then
  1690. begin
  1691. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1692. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1693. end
  1694. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1695. end
  1696. else if AnsiSameText(sl_Operand, 'REG8') then
  1697. begin
  1698. Item.OpNumber := il_Op;
  1699. Item.OpTyp := otREG8;
  1700. Item.OpActive := true;
  1701. if x64 then
  1702. begin
  1703. Item.Values.AddStrings(FReg8);
  1704. end
  1705. else Item.Values.AddStrings(FReg8);
  1706. end
  1707. else if AnsiSameText(sl_Operand, 'REG16') then
  1708. begin
  1709. Item.OpNumber := il_Op;
  1710. Item.OpTyp := otREG16;
  1711. Item.OpActive := true;
  1712. if x64 then
  1713. begin
  1714. Item.Values.AddStrings(FReg16);
  1715. end
  1716. else Item.Values.AddStrings(FReg16);
  1717. end
  1718. else if AnsiSameText(sl_Operand, 'REG32') then
  1719. begin
  1720. Item.OpNumber := il_Op;
  1721. Item.OpTyp := otREG32;
  1722. Item.OpActive := true;
  1723. if x64 then
  1724. begin
  1725. Item.Values.AddStrings(FReg32Base);
  1726. end
  1727. else Item.Values.AddStrings(FReg32Base);
  1728. end
  1729. else if AnsiSameText(sl_Operand, 'REG64') then
  1730. begin
  1731. Item.OpNumber := il_Op;
  1732. Item.OpTyp := otREG64;
  1733. Item.OpActive := true;
  1734. if x64 then
  1735. begin
  1736. Item.Values.AddStrings(FReg64Base);
  1737. end;
  1738. end
  1739. else if AnsiSameText(sl_Operand, 'RM32') then
  1740. begin
  1741. Item.OpNumber := il_Op;
  1742. Item.OpTyp := otRM32;
  1743. Item.OpActive := true;
  1744. Item.Values.AddStrings(FReg32Base);
  1745. if UsePrefix then sl_Prefix := 'dword ';
  1746. if x64 then
  1747. begin
  1748. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1749. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1750. end
  1751. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1752. end
  1753. else if AnsiSameText(sl_Operand, 'RM64') then
  1754. begin
  1755. Item.OpNumber := il_Op;
  1756. Item.OpTyp := otRM32;
  1757. Item.OpActive := true;
  1758. if UsePrefix then sl_Prefix := 'qword ';
  1759. if x64 then
  1760. begin
  1761. Item.Values.AddStrings(FReg64Base);
  1762. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1763. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1764. end
  1765. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1766. end
  1767. else if AnsiSameText(sl_Operand, 'IMM8') then
  1768. begin
  1769. Item.OpNumber := il_Op;
  1770. Item.OpTyp := otIMM8;
  1771. Item.OpActive := true;
  1772. Item.Values.Add('0');
  1773. end
  1774. else if AnsiSameText(sl_Operand, 'XMEM32') or
  1775. AnsiSameText(sl_Operand, 'XMEM32_M') then
  1776. begin
  1777. Item.OpNumber := il_Op;
  1778. Item.OpTyp := otXMEM32;
  1779. Item.OpActive := true;
  1780. if UsePrefix then sl_Prefix := 'oword ';
  1781. sSuffix := '';
  1782. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1783. if x64 then
  1784. begin
  1785. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  1786. if (sSuffix <> '') and
  1787. (MaskRegNeeded = false) then
  1788. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  1789. end
  1790. else
  1791. begin
  1792. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  1793. if (sSuffix <> '') and
  1794. (MaskRegNeeded = false) then
  1795. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  1796. end;
  1797. end
  1798. else if AnsiSameText(sl_Operand, 'XMEM64') or
  1799. AnsiSameText(sl_Operand, 'XMEM64_M') then
  1800. begin
  1801. Item.OpNumber := il_Op;
  1802. Item.OpTyp := otXMEM64;
  1803. Item.OpActive := true;
  1804. //if UsePrefix then sl_Prefix := 'oword ';
  1805. //
  1806. //if x64 then
  1807. //begin
  1808. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
  1809. //end
  1810. //else
  1811. //begin
  1812. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
  1813. //end;
  1814. sSuffix := '';
  1815. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1816. if x64 then
  1817. begin
  1818. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  1819. if (sSuffix <> '') and
  1820. (MaskRegNeeded = false)
  1821. then
  1822. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  1823. end
  1824. else
  1825. begin
  1826. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  1827. if (sSuffix <> '') and
  1828. (MaskRegNeeded = false)
  1829. then
  1830. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  1831. end;
  1832. end
  1833. else if AnsiSameText(sl_Operand, 'YMEM32') or
  1834. AnsiSameText(sl_Operand, 'YMEM32_M') then
  1835. begin
  1836. Item.OpNumber := il_Op;
  1837. Item.OpTyp := otYMEM32;
  1838. Item.OpActive := true;
  1839. if UsePrefix then sl_Prefix := 'yword ';
  1840. //if x64 then
  1841. //begin
  1842. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  1843. //end
  1844. //else
  1845. //begin
  1846. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  1847. //end;
  1848. sSuffix := '';
  1849. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1850. if x64 then
  1851. begin
  1852. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  1853. if (sSuffix <> '') and
  1854. (MaskRegNeeded = false)
  1855. then
  1856. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  1857. end
  1858. else
  1859. begin
  1860. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  1861. if (sSuffix <> '') and
  1862. (MaskRegNeeded = false)
  1863. then
  1864. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  1865. end;
  1866. end
  1867. else if AnsiSameText(sl_Operand, 'YMEM64') or
  1868. AnsiSameText(sl_Operand, 'YMEM64_M') then
  1869. begin
  1870. Item.OpNumber := il_Op;
  1871. Item.OpTyp := otYMEM64;
  1872. Item.OpActive := true;
  1873. if UsePrefix then sl_Prefix := 'yword ';
  1874. //if x64 then
  1875. //begin
  1876. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  1877. //end
  1878. //else
  1879. //begin
  1880. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  1881. //end;
  1882. sSuffix := '';
  1883. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1884. if x64 then
  1885. begin
  1886. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  1887. if (sSuffix <> '') and
  1888. (MaskRegNeeded = false)
  1889. then
  1890. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  1891. end
  1892. else
  1893. begin
  1894. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  1895. if (sSuffix <> '') and
  1896. (MaskRegNeeded = false)
  1897. then
  1898. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  1899. end;
  1900. end
  1901. else if AnsiSameText(sl_Operand, 'ZMEM32') or
  1902. AnsiSameText(sl_Operand, 'ZMEM32_M') then
  1903. begin
  1904. Item.OpNumber := il_Op;
  1905. Item.OpTyp := otZMEM32;
  1906. Item.OpActive := true;
  1907. if UsePrefix then sl_Prefix := 'zword ';
  1908. //if x64 then
  1909. //begin
  1910. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1911. //end
  1912. //else
  1913. //begin
  1914. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1915. //end;
  1916. sSuffix := '';
  1917. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1918. if x64 then
  1919. begin
  1920. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1921. if (sSuffix <> '') and
  1922. (MaskRegNeeded = false)
  1923. then
  1924. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  1925. end
  1926. else
  1927. begin
  1928. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1929. if (sSuffix <> '') and
  1930. (MaskRegNeeded = false)
  1931. then
  1932. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  1933. end;
  1934. end
  1935. else if AnsiSameText(sl_Operand, 'ZMEM64') or
  1936. AnsiSameText(sl_Operand, 'ZMEM64_M') then
  1937. begin
  1938. Item.OpNumber := il_Op;
  1939. Item.OpTyp := otZMEM64;
  1940. Item.OpActive := true;
  1941. if UsePrefix then sl_Prefix := 'zword ';
  1942. //if x64 then
  1943. //begin
  1944. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1945. //end
  1946. //else
  1947. //begin
  1948. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1949. //end;
  1950. sSuffix := '';
  1951. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1952. if x64 then
  1953. begin
  1954. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1955. if (sSuffix <> '') and
  1956. (MaskRegNeeded = false)
  1957. then
  1958. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  1959. end
  1960. else
  1961. begin
  1962. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1963. if (sSuffix <> '') and
  1964. (MaskRegNeeded = false)
  1965. then
  1966. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  1967. end;
  1968. end
  1969. else if AnsiSameText(sl_Operand, '2B32') then
  1970. begin
  1971. Item.OpNumber := il_Op;
  1972. Item.OpTyp := otB32;
  1973. Item.OpActive := true;
  1974. if x64 then
  1975. begin
  1976. MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  1977. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1978. end
  1979. else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  1980. end
  1981. else if AnsiSameText(sl_Operand, '4B32') then
  1982. begin
  1983. Item.OpNumber := il_Op;
  1984. Item.OpTyp := otB32;
  1985. Item.OpActive := true;
  1986. if x64 then
  1987. begin
  1988. MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  1989. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1990. end
  1991. else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  1992. end
  1993. else if AnsiSameText(sl_Operand, '8B32') then
  1994. begin
  1995. Item.OpNumber := il_Op;
  1996. Item.OpTyp := otB32;
  1997. Item.OpActive := true;
  1998. if x64 then
  1999. begin
  2000. MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  2001. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2002. end
  2003. else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  2004. end
  2005. else if AnsiSameText(sl_Operand, '16B32') then
  2006. begin
  2007. Item.OpNumber := il_Op;
  2008. Item.OpTyp := otB32;
  2009. Item.OpActive := true;
  2010. if x64 then
  2011. begin
  2012. MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  2013. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2014. end
  2015. else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  2016. end
  2017. else if AnsiSameText(sl_Operand, '2B64') then
  2018. begin
  2019. Item.OpNumber := il_Op;
  2020. Item.OpTyp := otB64;
  2021. Item.OpActive := true;
  2022. if x64 then
  2023. begin
  2024. MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  2025. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2026. end
  2027. else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  2028. end
  2029. else if AnsiSameText(sl_Operand, '4B64') then
  2030. begin
  2031. Item.OpNumber := il_Op;
  2032. Item.OpTyp := otB64;
  2033. Item.OpActive := true;
  2034. if x64 then
  2035. begin
  2036. MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  2037. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2038. end
  2039. else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  2040. end
  2041. else if AnsiSameText(sl_Operand, '8B64') then
  2042. begin
  2043. Item.OpNumber := il_Op;
  2044. Item.OpTyp := otB64;
  2045. Item.OpActive := true;
  2046. if x64 then
  2047. begin
  2048. MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  2049. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2050. end
  2051. else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  2052. end
  2053. else if AnsiSameText(sl_Operand, '16B64') then
  2054. begin
  2055. Item.OpNumber := il_Op;
  2056. Item.OpTyp := otB64;
  2057. Item.OpActive := true;
  2058. if x64 then
  2059. begin
  2060. MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  2061. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  2062. end
  2063. else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  2064. end
  2065. else if AnsiSameText(sl_Operand, 'KREG') or
  2066. AnsiSameText(sl_Operand, 'KREG_M') then
  2067. begin
  2068. Item.OpNumber := il_Op;
  2069. Item.OpTyp := otKREG;
  2070. Item.OpActive := true;
  2071. sSuffix := '';
  2072. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  2073. if UsePrefix then sl_Prefix := '';
  2074. for i := 0 to FRegKREG.Count - 1 do
  2075. Item.Values.Add(FRegKREG[i] + sSuffix);
  2076. end
  2077. else if trim(sl_Operand) = '' then
  2078. begin
  2079. Item.OpNumber := il_Op;
  2080. Item.OpTyp := otUnknown;
  2081. Item.OpActive := false;
  2082. Item.Values.Add('');
  2083. end
  2084. else
  2085. begin
  2086. Item.OpNumber := il_Op;
  2087. Item.OpTyp := otUnknown;
  2088. Item.OpActive := false;
  2089. Item.Values.Add('?' + sl_Operand);
  2090. end
  2091. end;
  2092. sl_RegCombi := '';
  2093. il_Operands := 0;
  2094. UsedParams := 0;
  2095. if OItem1.OpActive then
  2096. begin
  2097. inc(il_Operands);
  2098. UsedParams := UsedParams or 1;
  2099. end;
  2100. if OItem2.OpActive then
  2101. begin
  2102. inc(il_Operands);
  2103. UsedParams := UsedParams or 2;
  2104. end;
  2105. if OItem3.OpActive then
  2106. begin
  2107. inc(il_Operands);
  2108. UsedParams := UsedParams or 4;
  2109. end;
  2110. if OItem4.OpActive then
  2111. begin
  2112. inc(il_Operands);
  2113. UsedParams := UsedParams or 8;
  2114. end;
  2115. case il_Operands of
  2116. 1: UseDefault := UsedParams <> 1;
  2117. 2: UseDefault := UsedParams <> 3;
  2118. 3: UseDefault := UsedParams <> 7;
  2119. 4: UseDefault := UsedParams <> 15;
  2120. else UseDefault := true;
  2121. end;
  2122. //UseDefault := true;
  2123. if UseDefault then
  2124. begin
  2125. sl_Inst := format('%-20s', [aInst]);
  2126. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2127. begin
  2128. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2129. begin
  2130. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2131. begin
  2132. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2133. begin
  2134. sl_RegCombi := '';
  2135. if OItem1.OpActive then
  2136. begin
  2137. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2138. sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
  2139. end;
  2140. if OItem2.OpActive then
  2141. begin
  2142. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2143. sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
  2144. end;
  2145. if OItem3.OpActive then
  2146. begin
  2147. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2148. sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
  2149. end;
  2150. if OItem4.OpActive then
  2151. begin
  2152. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2153. sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
  2154. end;
  2155. if sl_RegCombi <> '' then
  2156. begin
  2157. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  2158. result.Add(sl_Inst + sl_RegCombi);
  2159. sl_RegCombi := '';
  2160. end;
  2161. end;
  2162. end;
  2163. end;
  2164. end;
  2165. end
  2166. else
  2167. begin
  2168. sl_Inst := format('%-20s', [aInst]);
  2169. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2170. begin
  2171. if OItem1.OpActive then
  2172. begin
  2173. sl_RegCombi1 := OItem1.Values[il_Op1];
  2174. end
  2175. else sl_RegCombi1 := '';
  2176. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2177. begin
  2178. if OItem2.OpActive then
  2179. begin
  2180. sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
  2181. end
  2182. else sl_RegCombi2 := sl_RegCombi1;
  2183. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2184. begin
  2185. if OItem3.OpActive then
  2186. begin
  2187. sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
  2188. end
  2189. else sl_RegCombi3 := sl_RegCombi2;
  2190. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2191. begin
  2192. if OItem4.OpActive then
  2193. begin
  2194. sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
  2195. end
  2196. else sl_RegCombi := sl_RegCombi3;
  2197. if sl_RegCombi <> '' then
  2198. begin
  2199. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  2200. result.Add(sl_Inst + sl_RegCombi);
  2201. sl_RegCombi := '';
  2202. end;
  2203. end;
  2204. end;
  2205. end;
  2206. end;
  2207. end;
  2208. finally
  2209. FreeAndNil(OItem4);
  2210. end;
  2211. finally
  2212. FreeAndNil(OItem3);
  2213. end;
  2214. finally
  2215. FreeAndNil(OItem2);
  2216. end;
  2217. finally
  2218. FreeAndNil(OItem1);
  2219. end;
  2220. end;
  2221. function TAsmTestGenerator.InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3,
  2222. aOp4: String): TStringList;
  2223. var
  2224. i: integer;
  2225. Item: TOperandListItem;
  2226. OItem1: TOperandListItem;
  2227. OItem2: TOperandListItem;
  2228. OItem3: TOperandListItem;
  2229. OItem4: TOperandListItem;
  2230. il_Op: integer;
  2231. il_Op1: integer;
  2232. il_Op2: integer;
  2233. il_Op3: integer;
  2234. il_Op4: integer;
  2235. sSuffix: string;
  2236. sl_Operand: String;
  2237. sl_Inst : String;
  2238. sl_RegCombi: String;
  2239. sl_Prefix: String;
  2240. UsePrefix: boolean;
  2241. il_Operands: integer;
  2242. UsedParams: cardinal;
  2243. UseDefault: boolean;
  2244. sl_RegCombi1: string;
  2245. sl_RegCombi2: string;
  2246. sl_RegCombi3: string;
  2247. function PrepareOperandTyp(const aTyp: String): String;
  2248. begin
  2249. result := aTyp;
  2250. if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
  2251. if result = 'XMMRM128' then result := 'XMMRM';
  2252. if result = 'YMMRM256' then result := 'YMMRM';
  2253. end;
  2254. begin
  2255. result := TStringList.Create;
  2256. OItem1 := TOperandListItem.Create;
  2257. try
  2258. OItem2 := TOperandListItem.Create;
  2259. try
  2260. OItem3 := TOperandListItem.Create;
  2261. try
  2262. OItem4 := TOperandListItem.Create;
  2263. try
  2264. UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
  2265. (UpperCase(aInst) = 'VCVTPD2PS') OR
  2266. (UpperCase(aInst) = 'VCVTSI2SD') OR
  2267. (UpperCase(aInst) = 'VCVTSI2SS') OR
  2268. (UpperCase(aInst) = 'VCVTTPD2DQ') or
  2269. (UpperCase(aInst) = 'VPMOVZXWQ') or
  2270. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  2271. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  2272. (UpperCase(aInst) = 'VCVTTPD2UDQ') or
  2273. (UpperCase(aInst) = 'VCVTUQQ2PS') or
  2274. (UpperCase(aInst) = 'VCVTQQ2PS') or
  2275. (UpperCase(aInst) = 'VCVTUSI2SD') or
  2276. (UpperCase(aInst) = 'VCVTUSI2SS') or
  2277. (UpperCase(aInst) = 'VFPCLASSPD') or
  2278. (UpperCase(aInst) = 'VFPCLASSPS') or
  2279. (UpperCase(aInst) = 'VCMPSS')
  2280. ;
  2281. for il_Op := 1 to 4 do
  2282. begin
  2283. sl_Prefix := '';
  2284. case il_Op of
  2285. 1: begin
  2286. Item := OItem1;
  2287. sl_Operand := aOp1;
  2288. end;
  2289. 2: begin
  2290. Item := OItem2;
  2291. sl_Operand := aOp2;
  2292. end;
  2293. 3: begin
  2294. Item := OItem3;
  2295. sl_Operand := aOp3;
  2296. end;
  2297. 4: begin
  2298. Item := OItem4;
  2299. sl_Operand := aOp4;
  2300. end;
  2301. end;
  2302. sl_Operand := PrepareOperandTyp(sl_Operand);
  2303. if (AnsiSameText(sl_Operand, 'XMMREG')) or
  2304. (AnsiSameText(sl_Operand, 'XMMREG_M')) or
  2305. (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
  2306. (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
  2307. (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
  2308. begin
  2309. Item.OpNumber := il_Op;
  2310. Item.OpTyp := otXMMReg;
  2311. Item.OpActive := true;
  2312. Item.Values.Add('XMM0');
  2313. end
  2314. else if (AnsiSameText(sl_Operand, 'XMMRM')) or
  2315. (AnsiSameText(sl_Operand, 'XMMRM_M')) or
  2316. (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
  2317. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  2318. (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
  2319. begin
  2320. Item.OpNumber := il_Op;
  2321. Item.OpTyp := otXMMRM;
  2322. Item.OpActive := true;
  2323. if UsePrefix then sl_Prefix := 'oword ';
  2324. Item.Values.Add(' lOWord');
  2325. Item.Values.Add(' gOWord');
  2326. Item.Values.Add(' clOWord');
  2327. Item.Values.Add(' cgOWord');
  2328. Item.Values.Add(' oword lOWord');
  2329. Item.Values.Add(' oword gOWord');
  2330. Item.Values.Add(' oword clOWord');
  2331. Item.Values.Add(' oword cgOWord');
  2332. Item.Values.Add(' byte lOWord');
  2333. Item.Values.Add(' byte gOWord');
  2334. Item.Values.Add(' byte clOWord');
  2335. Item.Values.Add(' byte cgOWord');
  2336. Item.Values.Add(' lRec');
  2337. Item.Values.Add(' gRec');
  2338. Item.Values.Add(' oword lRec');
  2339. Item.Values.Add(' oword gRec');
  2340. Item.Values.Add(' oword lRec.rOWord');
  2341. Item.Values.Add(' oword gRec.rOWord');
  2342. Item.Values.Add(' lRec.rByte');
  2343. Item.Values.Add(' gRec.rByte');
  2344. Item.Values.Add(' lRec.rWord');
  2345. Item.Values.Add(' gRec.rWord');
  2346. Item.Values.Add(' lRec.rDWord');
  2347. Item.Values.Add(' gRec.rDWord');
  2348. Item.Values.Add(' lRec.rQWord');
  2349. Item.Values.Add(' gRec.rQWord');
  2350. Item.Values.Add(' lRec.rOWord');
  2351. Item.Values.Add(' gRec.rOWord');
  2352. Item.Values.Add(' lRec.rYWord');
  2353. Item.Values.Add(' gRec.rYWord');
  2354. Item.Values.Add(' lRec.rZWord');
  2355. Item.Values.Add(' gRec.rZWord');
  2356. end
  2357. else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
  2358. (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
  2359. (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
  2360. (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
  2361. (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
  2362. begin
  2363. Item.OpNumber := il_Op;
  2364. Item.OpTyp := otXMMRM8;
  2365. Item.OpActive := true;
  2366. if UsePrefix then sl_Prefix := 'byte ';
  2367. Item.Values.Add('lbyte');
  2368. Item.Values.Add('gbyte');
  2369. Item.Values.Add('clbyte');
  2370. Item.Values.Add('cgbyte');
  2371. Item.Values.Add('byte lbyte');
  2372. Item.Values.Add('byte gbyte');
  2373. Item.Values.Add('byte clbyte');
  2374. Item.Values.Add('byte cgbyte');
  2375. Item.Values.Add(' lRec');
  2376. Item.Values.Add(' gRec');
  2377. Item.Values.Add(' byte lRec');
  2378. Item.Values.Add(' byte gRec');
  2379. Item.Values.Add(' lRec');
  2380. Item.Values.Add(' gRec');
  2381. Item.Values.Add(' lRec.rByte');
  2382. Item.Values.Add(' gRec.rByte');
  2383. Item.Values.Add(' lRec.rWord');
  2384. Item.Values.Add(' gRec.rWord');
  2385. Item.Values.Add(' lRec.rDWord');
  2386. Item.Values.Add(' gRec.rDWord');
  2387. Item.Values.Add(' lRec.rQWord');
  2388. Item.Values.Add(' gRec.rQWord');
  2389. Item.Values.Add(' lRec.rOWord');
  2390. Item.Values.Add(' gRec.rOWord');
  2391. Item.Values.Add(' lRec.rYWord');
  2392. Item.Values.Add(' gRec.rYWord');
  2393. Item.Values.Add(' lRec.rZWord');
  2394. Item.Values.Add(' gRec.rZWord');
  2395. end
  2396. else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
  2397. (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
  2398. (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
  2399. (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
  2400. (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
  2401. then
  2402. begin
  2403. Item.OpNumber := il_Op;
  2404. Item.OpTyp := otXMMRM16;
  2405. Item.OpActive := true;
  2406. Item.Values.Add('lword');
  2407. Item.Values.Add('gword');
  2408. Item.Values.Add('clword');
  2409. Item.Values.Add('cgword');
  2410. Item.Values.Add('word lword');
  2411. Item.Values.Add('word gword');
  2412. Item.Values.Add('word clword');
  2413. Item.Values.Add('word cgword');
  2414. Item.Values.Add(' lRec');
  2415. Item.Values.Add(' gRec');
  2416. Item.Values.Add(' word lRec');
  2417. Item.Values.Add(' word gRec');
  2418. Item.Values.Add(' lRec.rByte');
  2419. Item.Values.Add(' gRec.rByte');
  2420. Item.Values.Add(' lRec.rWord');
  2421. Item.Values.Add(' gRec.rWord');
  2422. Item.Values.Add(' lRec.rDWord');
  2423. Item.Values.Add(' gRec.rDWord');
  2424. Item.Values.Add(' lRec.rQWord');
  2425. Item.Values.Add(' gRec.rQWord');
  2426. Item.Values.Add(' lRec.rOWord');
  2427. Item.Values.Add(' gRec.rOWord');
  2428. Item.Values.Add(' lRec.rYWord');
  2429. Item.Values.Add(' gRec.rYWord');
  2430. Item.Values.Add(' lRec.rZWord');
  2431. Item.Values.Add(' gRec.rZWord');
  2432. end
  2433. else if (AnsiSameText(sl_Operand, 'YMMREG')) or
  2434. (AnsiSameText(sl_Operand, 'YMMREG_M')) or
  2435. (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
  2436. (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
  2437. (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
  2438. then
  2439. begin
  2440. Item.OpNumber := il_Op;
  2441. Item.OpTyp := otYMMReg;
  2442. Item.OpActive := true;
  2443. Item.Values.Add('YMM0');
  2444. end
  2445. else if (AnsiSameText(sl_Operand, 'YMMRM')) or
  2446. (AnsiSameText(sl_Operand, 'YMMRM_M')) or
  2447. (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
  2448. (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
  2449. (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
  2450. then
  2451. begin
  2452. Item.OpNumber := il_Op;
  2453. Item.OpTyp := otYMMRM;
  2454. Item.OpActive := true;
  2455. Item.Values.Add('lYWord');
  2456. Item.Values.Add('gYWord');
  2457. Item.Values.Add('clYWord');
  2458. Item.Values.Add('cgYWord');
  2459. Item.Values.Add('yword lYWord');
  2460. Item.Values.Add('yword gYWord');
  2461. Item.Values.Add('yword clYWord');
  2462. Item.Values.Add('yword cgYWord');
  2463. Item.Values.Add(' lRec');
  2464. Item.Values.Add(' gRec');
  2465. Item.Values.Add(' yword lRec');
  2466. Item.Values.Add(' yword gRec');
  2467. Item.Values.Add(' lRec.rByte');
  2468. Item.Values.Add(' gRec.rByte');
  2469. Item.Values.Add(' lRec.rWord');
  2470. Item.Values.Add(' gRec.rWord');
  2471. Item.Values.Add(' lRec.rDWord');
  2472. Item.Values.Add(' gRec.rDWord');
  2473. Item.Values.Add(' lRec.rQWord');
  2474. Item.Values.Add(' gRec.rQWord');
  2475. Item.Values.Add(' lRec.rOWord');
  2476. Item.Values.Add(' gRec.rOWord');
  2477. Item.Values.Add(' lRec.rYWord');
  2478. Item.Values.Add(' gRec.rYWord');
  2479. Item.Values.Add(' lRec.rZWord');
  2480. Item.Values.Add(' gRec.rZWord');
  2481. end
  2482. else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
  2483. (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
  2484. (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
  2485. (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
  2486. (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
  2487. then
  2488. begin
  2489. Item.OpNumber := il_Op;
  2490. Item.OpTyp := otZMMReg;
  2491. Item.OpActive := true;
  2492. Item.Values.Add('ZMM0');
  2493. end
  2494. else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
  2495. (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
  2496. (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
  2497. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  2498. (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
  2499. then
  2500. begin
  2501. Item.OpNumber := il_Op;
  2502. Item.OpTyp := otZMMRM;
  2503. Item.OpActive := true;
  2504. Item.Values.Add('lZWord');
  2505. Item.Values.Add('gZWord');
  2506. Item.Values.Add('clZWord');
  2507. Item.Values.Add('cgZWord');
  2508. Item.Values.Add('zword lZWord');
  2509. Item.Values.Add('zword gZWord');
  2510. Item.Values.Add('zword clZWord');
  2511. Item.Values.Add('zword cgZWord');
  2512. Item.Values.Add(' lRec');
  2513. Item.Values.Add(' gRec');
  2514. Item.Values.Add(' zword lRec');
  2515. Item.Values.Add(' zword gRec');
  2516. Item.Values.Add(' lRec.rByte');
  2517. Item.Values.Add(' gRec.rByte');
  2518. Item.Values.Add(' lRec.rWord');
  2519. Item.Values.Add(' gRec.rWord');
  2520. Item.Values.Add(' lRec.rDWord');
  2521. Item.Values.Add(' gRec.rDWord');
  2522. Item.Values.Add(' lRec.rQWord');
  2523. Item.Values.Add(' gRec.rQWord');
  2524. Item.Values.Add(' lRec.rOWord');
  2525. Item.Values.Add(' gRec.rOWord');
  2526. Item.Values.Add(' lRec.rYWord');
  2527. Item.Values.Add(' gRec.rYWord');
  2528. Item.Values.Add(' lRec.rZWord');
  2529. Item.Values.Add(' gRec.rZWord');
  2530. end
  2531. else if AnsiSameText(sl_Operand, 'MEM8') then
  2532. begin
  2533. Item.OpNumber := il_Op;
  2534. Item.OpTyp := otMEM8;
  2535. Item.OpActive := true;
  2536. Item.Values.Add('lByte');
  2537. Item.Values.Add('gByte');
  2538. Item.Values.Add('clByte');
  2539. Item.Values.Add('cgByte');
  2540. Item.Values.Add('byte lByte');
  2541. Item.Values.Add('byte gByte');
  2542. Item.Values.Add('byte clByte');
  2543. Item.Values.Add('byte cgByte');
  2544. Item.Values.Add(' lRec');
  2545. Item.Values.Add(' gRec');
  2546. Item.Values.Add(' byte lRec');
  2547. Item.Values.Add(' byte gRec');
  2548. Item.Values.Add(' lRec.rByte');
  2549. Item.Values.Add(' gRec.rByte');
  2550. end
  2551. else if AnsiSameText(sl_Operand, 'MEM16') or
  2552. AnsiSameText(sl_Operand, 'MEM16_M') then
  2553. begin
  2554. Item.OpNumber := il_Op;
  2555. Item.OpTyp := otMEM16;
  2556. Item.OpActive := true;
  2557. Item.Values.Add('lWord');
  2558. Item.Values.Add('gWord');
  2559. Item.Values.Add('clWord');
  2560. Item.Values.Add('cgWord');
  2561. Item.Values.Add('word lWord');
  2562. Item.Values.Add('word gWord');
  2563. Item.Values.Add('word clWord');
  2564. Item.Values.Add('word cgWord');
  2565. Item.Values.Add(' word lRec');
  2566. Item.Values.Add(' word gRec');
  2567. Item.Values.Add(' lRec.rWord');
  2568. Item.Values.Add(' gRec.rWord');
  2569. end
  2570. else if AnsiSameText(sl_Operand, 'MEM32') or
  2571. AnsiSameText(sl_Operand, 'MEM32_M') or
  2572. AnsiSameText(sl_Operand, 'MEM32_MZ') then
  2573. begin
  2574. Item.OpNumber := il_Op;
  2575. Item.OpTyp := otMEM32;
  2576. Item.OpActive := true;
  2577. Item.Values.Add('lDWord');
  2578. Item.Values.Add('gDWord');
  2579. Item.Values.Add('clDWord');
  2580. Item.Values.Add('cgDWord');
  2581. Item.Values.Add('dword lDWord');
  2582. Item.Values.Add('dword gDWord');
  2583. Item.Values.Add('dword clDWord');
  2584. Item.Values.Add('dword cgDWord');
  2585. Item.Values.Add(' dword lRec');
  2586. Item.Values.Add(' dword gRec');
  2587. Item.Values.Add(' lRec.rDWord');
  2588. Item.Values.Add(' gRec.rDWord');
  2589. end
  2590. else if (AnsiSameText(sl_Operand, 'MEM64')) or
  2591. (AnsiSameText(sl_Operand, 'MEM64_M')) or
  2592. (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
  2593. begin
  2594. Item.OpNumber := il_Op;
  2595. Item.OpTyp := otMEM64;
  2596. Item.OpActive := true;
  2597. Item.Values.Add('lQWord');
  2598. Item.Values.Add('gQWord');
  2599. Item.Values.Add('clQWord');
  2600. Item.Values.Add('cgQWord');
  2601. Item.Values.Add('qword lQWord');
  2602. Item.Values.Add('qword gQWord');
  2603. Item.Values.Add('qword clQWord');
  2604. Item.Values.Add('qword cgQWord');
  2605. Item.Values.Add(' qword lRec');
  2606. Item.Values.Add(' qword gRec');
  2607. Item.Values.Add(' lRec.rQWord');
  2608. Item.Values.Add(' gRec.rQWord');
  2609. end
  2610. else if (AnsiSameText(sl_Operand, 'MEM128')) or
  2611. (AnsiSameText(sl_Operand, 'MEM128_M')) or
  2612. (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
  2613. begin
  2614. Item.OpNumber := il_Op;
  2615. Item.OpTyp := otMEM128;
  2616. Item.OpActive := true;
  2617. Item.Values.Add('lOWord');
  2618. Item.Values.Add('gOWord');
  2619. Item.Values.Add('clOWord');
  2620. Item.Values.Add('cgOWord');
  2621. Item.Values.Add('oword lOWord');
  2622. Item.Values.Add('oword gOWord');
  2623. Item.Values.Add('oword clOWord');
  2624. Item.Values.Add('oword cgOWord');
  2625. Item.Values.Add(' lRec');
  2626. Item.Values.Add(' gRec');
  2627. Item.Values.Add(' oword lRec');
  2628. Item.Values.Add(' oword gRec');
  2629. Item.Values.Add(' lRec.rByte');
  2630. Item.Values.Add(' gRec.rByte');
  2631. Item.Values.Add(' lRec.rWord');
  2632. Item.Values.Add(' gRec.rWord');
  2633. Item.Values.Add(' lRec.rDWord');
  2634. Item.Values.Add(' gRec.rDWord');
  2635. Item.Values.Add(' lRec.rQWord');
  2636. Item.Values.Add(' gRec.rQWord');
  2637. Item.Values.Add(' lRec.rOWord');
  2638. Item.Values.Add(' gRec.rOWord');
  2639. Item.Values.Add(' lRec.rYWord');
  2640. Item.Values.Add(' gRec.rYWord');
  2641. Item.Values.Add(' lRec.rZWord');
  2642. Item.Values.Add(' gRec.rZWord');
  2643. end
  2644. else if (AnsiSameText(sl_Operand, 'MEM256')) or
  2645. (AnsiSameText(sl_Operand, 'MEM256_M')) or
  2646. (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
  2647. begin
  2648. Item.OpNumber := il_Op;
  2649. Item.OpTyp := otMEM256;
  2650. Item.OpActive := true;
  2651. Item.Values.Add('lYWord');
  2652. Item.Values.Add('gYWord');
  2653. Item.Values.Add('clYWord');
  2654. Item.Values.Add('cgYWord');
  2655. Item.Values.Add('yword lYWord');
  2656. Item.Values.Add('yword gYWord');
  2657. Item.Values.Add('yword clYWord');
  2658. Item.Values.Add('yword cgYWord');
  2659. Item.Values.Add(' lRec');
  2660. Item.Values.Add(' gRec');
  2661. Item.Values.Add(' yword lRec');
  2662. Item.Values.Add(' yword gRec');
  2663. Item.Values.Add(' lRec.rByte');
  2664. Item.Values.Add(' gRec.rByte');
  2665. Item.Values.Add(' lRec.rWord');
  2666. Item.Values.Add(' gRec.rWord');
  2667. Item.Values.Add(' lRec.rDWord');
  2668. Item.Values.Add(' gRec.rDWord');
  2669. Item.Values.Add(' lRec.rQWord');
  2670. Item.Values.Add(' gRec.rQWord');
  2671. Item.Values.Add(' lRec.rOWord');
  2672. Item.Values.Add(' gRec.rOWord');
  2673. Item.Values.Add(' lRec.rYWord');
  2674. Item.Values.Add(' gRec.rYWord');
  2675. Item.Values.Add(' lRec.rZWord');
  2676. Item.Values.Add(' gRec.rZWord');
  2677. end
  2678. else if (AnsiSameText(sl_Operand, 'MEM512')) or
  2679. (AnsiSameText(sl_Operand, 'MEM512_M')) or
  2680. (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
  2681. begin
  2682. Item.OpNumber := il_Op;
  2683. Item.OpTyp := otMEM512;
  2684. Item.OpActive := true;
  2685. Item.Values.Add('lZWord');
  2686. Item.Values.Add('gZWord');
  2687. Item.Values.Add('clZWord');
  2688. Item.Values.Add('cgZWord');
  2689. Item.Values.Add('zword lZWord');
  2690. Item.Values.Add('zword gZWord');
  2691. Item.Values.Add('zword clZWord');
  2692. Item.Values.Add('zword cgZWord');
  2693. Item.Values.Add(' lRec');
  2694. Item.Values.Add(' gRec');
  2695. Item.Values.Add(' zword lRec');
  2696. Item.Values.Add(' zword gRec');
  2697. end
  2698. else if AnsiSameText(sl_Operand, 'REG8') then
  2699. begin
  2700. Item.OpNumber := il_Op;
  2701. Item.OpTyp := otREG8;
  2702. Item.OpActive := true;
  2703. Item.Values.Add('al');
  2704. end
  2705. else if AnsiSameText(sl_Operand, 'REG16') then
  2706. begin
  2707. Item.OpNumber := il_Op;
  2708. Item.OpTyp := otREG16;
  2709. Item.OpActive := true;
  2710. Item.Values.Add('ax');
  2711. end
  2712. else if AnsiSameText(sl_Operand, 'REG32') then
  2713. begin
  2714. Item.OpNumber := il_Op;
  2715. Item.OpTyp := otREG32;
  2716. Item.OpActive := true;
  2717. Item.Values.Add('eax');
  2718. end
  2719. else if AnsiSameText(sl_Operand, 'REG64') then
  2720. begin
  2721. Item.OpNumber := il_Op;
  2722. Item.OpTyp := otREG64;
  2723. Item.OpActive := true;
  2724. Item.Values.Add('rax');
  2725. end
  2726. else if AnsiSameText(sl_Operand, 'RM32') then
  2727. begin
  2728. Item.OpNumber := il_Op;
  2729. Item.OpTyp := otRM32;
  2730. Item.OpActive := true;
  2731. Item.Values.Add('lDWord');
  2732. Item.Values.Add('gDWord');
  2733. end
  2734. else if AnsiSameText(sl_Operand, 'RM64') then
  2735. begin
  2736. Item.OpNumber := il_Op;
  2737. Item.OpTyp := otRM64;
  2738. Item.OpActive := true;
  2739. Item.Values.Add('lQWord');
  2740. Item.Values.Add('gQWord');
  2741. end
  2742. else if AnsiSameText(sl_Operand, 'IMM8') then
  2743. begin
  2744. Item.OpNumber := il_Op;
  2745. Item.OpTyp := otIMM8;
  2746. Item.OpActive := true;
  2747. Item.Values.Add('0');
  2748. end
  2749. else if AnsiSameText(sl_Operand, 'XMEM32') or
  2750. AnsiSameText(sl_Operand, 'XMEM32_M') then
  2751. begin
  2752. Item.OpNumber := il_Op;
  2753. Item.OpTyp := otXMEM32;
  2754. Item.OpActive := true;
  2755. end
  2756. else if AnsiSameText(sl_Operand, 'XMEM64') or
  2757. AnsiSameText(sl_Operand, 'XMEM64_M') then
  2758. begin
  2759. Item.OpNumber := il_Op;
  2760. Item.OpTyp := otXMEM64;
  2761. Item.OpActive := true;
  2762. end
  2763. else if AnsiSameText(sl_Operand, 'YMEM32') or
  2764. AnsiSameText(sl_Operand, 'YMEM32_M') then
  2765. begin
  2766. Item.OpNumber := il_Op;
  2767. Item.OpTyp := otYMEM32;
  2768. Item.OpActive := true;
  2769. end
  2770. else if AnsiSameText(sl_Operand, 'YMEM64') or
  2771. AnsiSameText(sl_Operand, 'YMEM64_M') then
  2772. begin
  2773. Item.OpNumber := il_Op;
  2774. Item.OpTyp := otYMEM64;
  2775. Item.OpActive := true;
  2776. if UsePrefix then sl_Prefix := 'yword ';
  2777. end
  2778. else if AnsiSameText(sl_Operand, 'ZMEM32') or
  2779. AnsiSameText(sl_Operand, 'ZMEM32_M') then
  2780. begin
  2781. Item.OpNumber := il_Op;
  2782. Item.OpTyp := otZMEM32;
  2783. Item.OpActive := true;
  2784. if UsePrefix then sl_Prefix := 'zword ';
  2785. end
  2786. else if AnsiSameText(sl_Operand, 'ZMEM64') or
  2787. AnsiSameText(sl_Operand, 'ZMEM64_M') then
  2788. begin
  2789. Item.OpNumber := il_Op;
  2790. Item.OpTyp := otZMEM64;
  2791. Item.OpActive := true;
  2792. if UsePrefix then sl_Prefix := 'zword ';
  2793. end
  2794. else if AnsiSameText(sl_Operand, '2B32') then
  2795. begin
  2796. Item.OpNumber := il_Op;
  2797. Item.OpTyp := otB32;
  2798. Item.OpActive := true;
  2799. Item.Values.Add('lDWord {1to2}');
  2800. Item.Values.Add('gDWord {1to2}');
  2801. end
  2802. else if AnsiSameText(sl_Operand, '4B32') then
  2803. begin
  2804. Item.OpNumber := il_Op;
  2805. Item.OpTyp := otB32;
  2806. Item.OpActive := true;
  2807. Item.Values.Add('lDWord {1to4}');
  2808. Item.Values.Add('gDWord {1to4}');
  2809. end
  2810. else if AnsiSameText(sl_Operand, '8B32') then
  2811. begin
  2812. Item.OpNumber := il_Op;
  2813. Item.OpTyp := otB32;
  2814. Item.OpActive := true;
  2815. Item.Values.Add('lDWord {1to8}');
  2816. Item.Values.Add('gDWord {1to8}');
  2817. end
  2818. else if AnsiSameText(sl_Operand, '16B32') then
  2819. begin
  2820. Item.OpNumber := il_Op;
  2821. Item.OpTyp := otB32;
  2822. Item.OpActive := true;
  2823. Item.Values.Add('lDWord {1to16}');
  2824. Item.Values.Add('gDWord {1to16}');
  2825. end
  2826. else if AnsiSameText(sl_Operand, '2B64') then
  2827. begin
  2828. Item.OpNumber := il_Op;
  2829. Item.OpTyp := otB64;
  2830. Item.OpActive := true;
  2831. Item.Values.Add('lQWord {1to2}');
  2832. Item.Values.Add('gQWord {1to2}');
  2833. end
  2834. else if AnsiSameText(sl_Operand, '4B64') then
  2835. begin
  2836. Item.OpNumber := il_Op;
  2837. Item.OpTyp := otB64;
  2838. Item.OpActive := true;
  2839. Item.Values.Add('lQWord {1to4}');
  2840. Item.Values.Add('gQWord {1to4}');
  2841. end
  2842. else if AnsiSameText(sl_Operand, '8B64') then
  2843. begin
  2844. Item.OpNumber := il_Op;
  2845. Item.OpTyp := otB64;
  2846. Item.OpActive := true;
  2847. Item.Values.Add('lQWord {1to8}');
  2848. Item.Values.Add('gQWord {1to8}');
  2849. end
  2850. else if AnsiSameText(sl_Operand, '16B64') then
  2851. begin
  2852. Item.OpNumber := il_Op;
  2853. Item.OpTyp := otB64;
  2854. Item.OpActive := true;
  2855. Item.Values.Add('lQWord {1to16}');
  2856. Item.Values.Add('gQWord {1to16}');
  2857. end
  2858. else if AnsiSameText(sl_Operand, 'KREG') or
  2859. AnsiSameText(sl_Operand, 'KREG_M') then
  2860. begin
  2861. Item.OpNumber := il_Op;
  2862. Item.OpTyp := otKREG;
  2863. Item.OpActive := true;
  2864. Item.Values.Add('k1');
  2865. end
  2866. else if trim(sl_Operand) = '' then
  2867. begin
  2868. Item.OpNumber := il_Op;
  2869. Item.OpTyp := otUnknown;
  2870. Item.OpActive := false;
  2871. Item.Values.Add('');
  2872. end
  2873. else
  2874. begin
  2875. Item.OpNumber := il_Op;
  2876. Item.OpTyp := otUnknown;
  2877. Item.OpActive := false;
  2878. Item.Values.Add('?' + sl_Operand);
  2879. end
  2880. end;
  2881. sl_RegCombi := '';
  2882. il_Operands := 0;
  2883. UsedParams := 0;
  2884. if OItem1.OpActive then
  2885. begin
  2886. inc(il_Operands);
  2887. UsedParams := UsedParams or 1;
  2888. end;
  2889. if OItem2.OpActive then
  2890. begin
  2891. inc(il_Operands);
  2892. UsedParams := UsedParams or 2;
  2893. end;
  2894. if OItem3.OpActive then
  2895. begin
  2896. inc(il_Operands);
  2897. UsedParams := UsedParams or 4;
  2898. end;
  2899. if OItem4.OpActive then
  2900. begin
  2901. inc(il_Operands);
  2902. UsedParams := UsedParams or 8;
  2903. end;
  2904. case il_Operands of
  2905. 1: UseDefault := UsedParams <> 1;
  2906. 2: UseDefault := UsedParams <> 3;
  2907. 3: UseDefault := UsedParams <> 7;
  2908. 4: UseDefault := UsedParams <> 15;
  2909. else UseDefault := true;
  2910. end;
  2911. //UseDefault := true;
  2912. if UseDefault then
  2913. begin
  2914. sl_Inst := format('%-20s', [aInst]);
  2915. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2916. begin
  2917. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2918. begin
  2919. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2920. begin
  2921. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2922. begin
  2923. sl_RegCombi := '';
  2924. if OItem1.OpActive then
  2925. begin
  2926. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2927. sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
  2928. end;
  2929. if OItem2.OpActive then
  2930. begin
  2931. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2932. sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
  2933. end;
  2934. if OItem3.OpActive then
  2935. begin
  2936. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2937. sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
  2938. end;
  2939. if OItem4.OpActive then
  2940. begin
  2941. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2942. sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
  2943. end;
  2944. if sl_RegCombi <> '' then
  2945. begin
  2946. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  2947. result.Add(sl_Inst + sl_RegCombi);
  2948. sl_RegCombi := '';
  2949. end;
  2950. end;
  2951. end;
  2952. end;
  2953. end;
  2954. end
  2955. else
  2956. begin
  2957. sl_Inst := format('%-20s', [aInst]);
  2958. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2959. begin
  2960. if OItem1.OpActive then
  2961. begin
  2962. sl_RegCombi1 := OItem1.Values[il_Op1];
  2963. end
  2964. else sl_RegCombi1 := '';
  2965. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2966. begin
  2967. if OItem2.OpActive then
  2968. begin
  2969. sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
  2970. end
  2971. else sl_RegCombi2 := sl_RegCombi1;
  2972. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2973. begin
  2974. if OItem3.OpActive then
  2975. begin
  2976. sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
  2977. end
  2978. else sl_RegCombi3 := sl_RegCombi2;
  2979. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2980. begin
  2981. if OItem4.OpActive then
  2982. begin
  2983. sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
  2984. end
  2985. else sl_RegCombi := sl_RegCombi3;
  2986. if sl_RegCombi <> '' then
  2987. begin
  2988. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  2989. result.Add(sl_Inst + sl_RegCombi);
  2990. sl_RegCombi := '';
  2991. end;
  2992. end;
  2993. end;
  2994. end;
  2995. end;
  2996. end;
  2997. finally
  2998. FreeAndNil(OItem4);
  2999. end;
  3000. finally
  3001. FreeAndNil(OItem3);
  3002. end;
  3003. finally
  3004. FreeAndNil(OItem2);
  3005. end;
  3006. finally
  3007. FreeAndNil(OItem1);
  3008. end;
  3009. end;
  3010. constructor TAsmTestGenerator.Create;
  3011. begin
  3012. inherited;
  3013. FX64 := true;
  3014. FAVX512 := false;
  3015. FReg8 := TStringList.Create;
  3016. FReg16 := TStringList.Create;
  3017. FReg32Base := TStringList.Create;
  3018. FReg32Index := TStringList.Create;
  3019. FReg64Base := TStringList.Create;
  3020. FReg64Index := TStringList.Create;
  3021. FReg6432Base := TStringList.Create;
  3022. FReg6432Index := TStringList.Create;
  3023. FReg32XMMIndex := TStringList.Create;
  3024. FReg32YMMIndex := TStringList.Create;
  3025. FReg32ZMMIndex := TStringList.Create;
  3026. FReg64XMMIndex := TStringList.Create;
  3027. FReg64YMMIndex := TStringList.Create;
  3028. FReg64ZMMIndex := TStringList.Create;
  3029. FRegKREG := TStringList.Create;
  3030. FReg8.Add('AL');
  3031. FReg8.Add('BL');
  3032. FReg8.Add('CL');
  3033. FReg8.Add('DL');
  3034. FReg16.Add('AX');
  3035. FReg16.Add('BX');
  3036. FReg16.Add('CX');
  3037. FReg16.Add('DX');
  3038. FReg32Base.Add('EAX');
  3039. FReg32Base.Add('EBX');
  3040. FReg32Base.Add('ECX');
  3041. FReg32Base.Add('EDX');
  3042. //FReg32Base.Add('ESP');
  3043. //FReg32Base.Add('EBP');
  3044. FReg32Base.Add('EDI');
  3045. FReg32Base.Add('ESI');
  3046. FReg32Index.Add('EAX');
  3047. FReg32Index.Add('EBX');
  3048. FReg32Index.Add('ECX');
  3049. FReg32Index.Add('EDX');
  3050. //FReg32Index.Add('EBP');
  3051. FReg32Index.Add('EDI');
  3052. FReg32Index.Add('ESI');
  3053. FReg64Base.Add('RAX');
  3054. FReg64Base.Add('RBX');
  3055. FReg64Base.Add('RCX');
  3056. FReg64Base.Add('RDX');
  3057. //FReg64Base.Add('RSP');
  3058. //FReg64Base.Add('RBP');
  3059. FReg64Base.Add('RDI');
  3060. FReg64Base.Add('RSI');
  3061. FReg64Base.Add('R8');
  3062. FReg64Base.Add('R9');
  3063. FReg64Base.Add('R10');
  3064. FReg64Base.Add('R11');
  3065. FReg64Base.Add('R12');
  3066. FReg64Base.Add('R13');
  3067. FReg64Base.Add('R14');
  3068. FReg64Base.Add('R15');
  3069. FReg64Index.Add('RAX');
  3070. FReg64Index.Add('RBX');
  3071. FReg64Index.Add('RCX');
  3072. FReg64Index.Add('RDX');
  3073. //FReg64Index.Add('RBP');
  3074. FReg64Index.Add('RDI');
  3075. FReg64Index.Add('RSI');
  3076. FReg64Index.Add('R8');
  3077. FReg64Index.Add('R9');
  3078. FReg64Index.Add('R10');
  3079. FReg64Index.Add('R11');
  3080. FReg64Index.Add('R12');
  3081. FReg64Index.Add('R13');
  3082. FReg64Index.Add('R14');
  3083. FReg64Index.Add('R15');
  3084. FReg6432Base.Add('EAX');
  3085. FReg6432Base.Add('EBX');
  3086. FReg6432Base.Add('ECX');
  3087. FReg6432Base.Add('EDX');
  3088. FReg6432Base.Add('ESP');
  3089. //FReg6432Base.Add('EBP');
  3090. FReg6432Base.Add('EDI');
  3091. FReg6432Base.Add('ESI');
  3092. FReg6432Base.Add('R8D');
  3093. FReg6432Base.Add('R9D');
  3094. FReg6432Base.Add('R10D');
  3095. FReg6432Base.Add('R11D');
  3096. FReg6432Base.Add('R12D');
  3097. FReg6432Base.Add('R13D');
  3098. FReg6432Base.Add('R14D');
  3099. FReg6432Base.Add('R15D');
  3100. FReg6432Index.Add('EAX');
  3101. FReg6432Index.Add('EBX');
  3102. FReg6432Index.Add('ECX');
  3103. FReg6432Index.Add('EDX');
  3104. //FReg6432Index.Add('EBP');
  3105. FReg6432Index.Add('EDI');
  3106. FReg6432Index.Add('ESI');
  3107. FReg6432Index.Add('R8D');
  3108. FReg6432Index.Add('R9D');
  3109. FReg6432Index.Add('R10D');
  3110. FReg6432Index.Add('R11D');
  3111. FReg6432Index.Add('R12D');
  3112. FReg6432Index.Add('R13D');
  3113. FReg6432Index.Add('R14D');
  3114. FReg6432Index.Add('R15D');
  3115. FReg32XMMIndex.ADD('XMM0');
  3116. FReg32XMMIndex.ADD('XMM1');
  3117. FReg32XMMIndex.ADD('XMM2');
  3118. FReg32XMMIndex.ADD('XMM3');
  3119. FReg32XMMIndex.ADD('XMM4');
  3120. FReg32XMMIndex.ADD('XMM5');
  3121. FReg32XMMIndex.ADD('XMM6');
  3122. FReg32XMMIndex.ADD('XMM7');
  3123. FReg32YMMIndex.ADD('YMM0');
  3124. FReg32YMMIndex.ADD('YMM1');
  3125. FReg32YMMIndex.ADD('YMM2');
  3126. FReg32YMMIndex.ADD('YMM3');
  3127. FReg32YMMIndex.ADD('YMM4');
  3128. FReg32YMMIndex.ADD('YMM5');
  3129. FReg32YMMIndex.ADD('YMM6');
  3130. FReg32YMMIndex.ADD('YMM7');
  3131. FReg32ZMMIndex.ADD('ZMM0');
  3132. FReg32ZMMIndex.ADD('ZMM1');
  3133. FReg32ZMMIndex.ADD('ZMM2');
  3134. FReg32ZMMIndex.ADD('ZMM3');
  3135. FReg32ZMMIndex.ADD('ZMM4');
  3136. FReg32ZMMIndex.ADD('ZMM5');
  3137. FReg32ZMMIndex.ADD('ZMM6');
  3138. FReg32ZMMIndex.ADD('ZMM7');
  3139. FReg64XMMIndex.ADD('XMM0');
  3140. FReg64XMMIndex.ADD('XMM1');
  3141. FReg64XMMIndex.ADD('XMM2');
  3142. FReg64XMMIndex.ADD('XMM3');
  3143. FReg64XMMIndex.ADD('XMM4');
  3144. FReg64XMMIndex.ADD('XMM5');
  3145. FReg64XMMIndex.ADD('XMM6');
  3146. FReg64XMMIndex.ADD('XMM7');
  3147. FReg64XMMIndex.ADD('XMM8');
  3148. FReg64XMMIndex.ADD('XMM9');
  3149. FReg64XMMIndex.ADD('XMM10');
  3150. FReg64XMMIndex.ADD('XMM11');
  3151. FReg64XMMIndex.ADD('XMM12');
  3152. FReg64XMMIndex.ADD('XMM13');
  3153. FReg64XMMIndex.ADD('XMM14');
  3154. FReg64XMMIndex.ADD('XMM15');
  3155. FReg64YMMIndex.ADD('YMM0');
  3156. FReg64YMMIndex.ADD('YMM1');
  3157. FReg64YMMIndex.ADD('YMM2');
  3158. FReg64YMMIndex.ADD('YMM3');
  3159. FReg64YMMIndex.ADD('YMM4');
  3160. FReg64YMMIndex.ADD('YMM5');
  3161. FReg64YMMIndex.ADD('YMM6');
  3162. FReg64YMMIndex.ADD('YMM7');
  3163. FReg64YMMIndex.ADD('YMM8');
  3164. FReg64YMMIndex.ADD('YMM9');
  3165. FReg64YMMIndex.ADD('YMM10');
  3166. FReg64YMMIndex.ADD('YMM11');
  3167. FReg64YMMIndex.ADD('YMM12');
  3168. FReg64YMMIndex.ADD('YMM13');
  3169. FReg64YMMIndex.ADD('YMM14');
  3170. FReg64YMMIndex.ADD('YMM15');
  3171. FReg64ZMMIndex.ADD('ZMM0');
  3172. FReg64ZMMIndex.ADD('ZMM1');
  3173. FReg64ZMMIndex.ADD('ZMM2');
  3174. FReg64ZMMIndex.ADD('ZMM3');
  3175. FReg64ZMMIndex.ADD('ZMM4');
  3176. FReg64ZMMIndex.ADD('ZMM5');
  3177. FReg64ZMMIndex.ADD('ZMM6');
  3178. FReg64ZMMIndex.ADD('ZMM7');
  3179. FReg64ZMMIndex.ADD('ZMM8');
  3180. FReg64ZMMIndex.ADD('ZMM9');
  3181. FReg64ZMMIndex.ADD('ZMM10');
  3182. FReg64ZMMIndex.ADD('ZMM11');
  3183. FReg64ZMMIndex.ADD('ZMM12');
  3184. FReg64ZMMIndex.ADD('ZMM13');
  3185. FReg64ZMMIndex.ADD('ZMM14');
  3186. FReg64ZMMIndex.ADD('ZMM15');
  3187. FReg64ZMMIndex.ADD('ZMM16');
  3188. FReg64ZMMIndex.ADD('ZMM17');
  3189. FReg64ZMMIndex.ADD('ZMM18');
  3190. FReg64ZMMIndex.ADD('ZMM19');
  3191. FReg64ZMMIndex.ADD('ZMM20');
  3192. FReg64ZMMIndex.ADD('ZMM21');
  3193. FReg64ZMMIndex.ADD('ZMM22');
  3194. FReg64ZMMIndex.ADD('ZMM23');
  3195. FReg64ZMMIndex.ADD('ZMM24');
  3196. FReg64ZMMIndex.ADD('ZMM25');
  3197. FReg64ZMMIndex.ADD('ZMM26');
  3198. FReg64ZMMIndex.ADD('ZMM27');
  3199. FReg64ZMMIndex.ADD('ZMM28');
  3200. FReg64ZMMIndex.ADD('ZMM29');
  3201. FReg64ZMMIndex.ADD('ZMM30');
  3202. FReg64ZMMIndex.ADD('ZMM31');
  3203. FRegKREG.ADD('K0');
  3204. FRegKREG.ADD('K1');
  3205. FRegKREG.ADD('K2');
  3206. FRegKREG.ADD('K3');
  3207. FRegKREG.ADD('K4');
  3208. FRegKREG.ADD('K5');
  3209. FRegKREG.ADD('K6');
  3210. FRegKREG.ADD('K7');
  3211. end;
  3212. destructor TAsmTestGenerator.Destroy;
  3213. begin
  3214. FreeAndNil(FReg8);
  3215. FreeAndNil(FReg16);
  3216. FreeAndNil(FReg32Base);
  3217. FreeAndNil(FReg32Index);
  3218. FreeAndNil(FReg64Base);
  3219. FreeAndNil(FReg64Index);
  3220. FreeAndNil(FReg6432Base);
  3221. FreeAndNil(FReg6432Index);
  3222. FreeAndNil(FReg32XMMIndex);
  3223. FreeAndNil(FReg32YMMIndex);
  3224. FreeAndNil(FReg32ZMMIndex);
  3225. FreeAndNil(FReg64XMMIndex);
  3226. FreeAndNil(FReg64YMMIndex);
  3227. FreeAndNil(FReg64ZMMIndex);
  3228. FreeAndnil(FRegKREG);
  3229. inherited;
  3230. end;
  3231. procedure TAsmTestGenerator.MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg,
  3232. aSLIndexReg, aRList: TStringList);
  3233. var
  3234. il_Base: integer;
  3235. il_Index: integer;
  3236. begin
  3237. for il_Base := 0 to aSLBaseReg.Count - 1 do
  3238. begin
  3239. aRList.Add(format(aPrefix + '[%s]%s', [aSLBaseReg[il_Base], aSuffix]));
  3240. for il_Index := 0 to aSLIndexReg.Count - 1 do
  3241. begin
  3242. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3243. aRList.Add(format(aPrefix + '[%s + %s + $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3244. aRList.Add(format(aPrefix + '[%s + %s + $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3245. aRList.Add(format(aPrefix + '[%s + %s - $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3246. aRList.Add(format(aPrefix + '[%s + %s - $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3247. aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3248. aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3249. aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3250. aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3251. aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3252. aRList.Add(format(aPrefix + '[%s + %s * 8 + 64]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3253. end;
  3254. end;
  3255. end;
  3256. procedure TAsmTestGenerator.VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String;
  3257. aSLBaseReg, aSLIndexReg, aRList: TStringList);
  3258. var
  3259. il_Base: integer;
  3260. il_Index: integer;
  3261. begin
  3262. //for il_Index := 0 to aSLIndexReg.Count - 1 do
  3263. //begin
  3264. // aRList.Add(format(aPrefix + '[%s]', [aSLIndexReg[il_Index]]));
  3265. //
  3266. // aRList.Add(format(aPrefix + '[%s * 2]', [aSLIndexReg[il_Index]]));
  3267. // aRList.Add(format(aPrefix + '[%s * 4]', [aSLIndexReg[il_Index]]));
  3268. // aRList.Add(format(aPrefix + '[%s * 8]', [aSLIndexReg[il_Index]]));
  3269. //
  3270. // aRList.Add(format(aPrefix + '[%s * 2 + 16]', [aSLIndexReg[il_Index]]));
  3271. // aRList.Add(format(aPrefix + '[%s * 4 + 32]', [aSLIndexReg[il_Index]]));
  3272. // aRList.Add(format(aPrefix + '[%s * 8 + 48]', [aSLIndexReg[il_Index]]));
  3273. //end;
  3274. for il_Base := 0 to aSLBaseReg.Count - 1 do
  3275. begin
  3276. //aRList.Add(format(aPrefix + '[%s]', [aSLBaseReg[il_Base]]));
  3277. for il_Index := 0 to aSLIndexReg.Count - 1 do
  3278. begin
  3279. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3280. aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3281. aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3282. aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  3283. //aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  3284. //aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  3285. //aRList.Add(format(aPrefix + '[%s + %s * 8 + 48]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  3286. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLIndexReg[il_Index], aSLBaseReg[il_Base], aSuffix]));
  3287. //aRList.Add(format(aPrefix + '[%s + %s + 16]', [aSLIndexReg[il_Index], aSLBaseReg[il_Base]]));
  3288. end;
  3289. end;
  3290. end;
  3291. class procedure TAsmTestGenerator.CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
  3292. aOp4: String; aSL: TStringList);
  3293. var
  3294. sl: TStringList;
  3295. begin
  3296. with TAsmTestGenerator.Create do
  3297. try
  3298. Fx64 := aX64;
  3299. FAVX512 := aAVX512;
  3300. FSAE := aSAE;
  3301. sl := InternalCalcTestData(aInst, aOp1, aOp2, aOp3, aOp4);
  3302. try
  3303. aSL.AddStrings(sl);
  3304. finally
  3305. FreeAndNil(sl);
  3306. end;
  3307. finally
  3308. Free;
  3309. end;
  3310. end;
  3311. class procedure TAsmTestGenerator.CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
  3312. aOp4: String; aSL: TStringList);
  3313. var
  3314. sl: TStringList;
  3315. begin
  3316. with TAsmTestGenerator.Create do
  3317. try
  3318. Fx64 := aX64;
  3319. FAVX512 := aAVX512;
  3320. FSAE := aSAE;
  3321. sl := InternalCalcTestDataMREF(aInst, aOp1, aOp2, aOp3, aOp4);
  3322. try
  3323. aSL.AddStrings(sl);
  3324. finally
  3325. FreeAndNil(sl);
  3326. end;
  3327. finally
  3328. Free;
  3329. end;
  3330. end;
  3331. class procedure TAsmTestGenerator.CalcTestInstFile;
  3332. var
  3333. i,j: integer;
  3334. sInst: string;
  3335. sI386: string;
  3336. sX8664: string;
  3337. sAVX512: string;
  3338. sOperands: string;
  3339. sLine: string;
  3340. sl: TStringList;
  3341. bVEX: boolean;
  3342. bEVEX: boolean;
  3343. b256 : boolean;
  3344. b512 : boolean;
  3345. begin
  3346. sl := TStringList.Create;
  3347. try
  3348. //tinsentry=packed record
  3349. // opcode : tasmop;
  3350. // ops : byte;
  3351. // //optypes : array[0..max_operands-1] of longint;
  3352. // optypes : array[0..3] of int64; //TG
  3353. // code : array[0..11] of char;
  3354. // flags : tinsflags;
  3355. //end;
  3356. for i := 0 to length(InsTab) - 1 do
  3357. begin
  3358. bVEX := false;
  3359. bEVEX := false;
  3360. b256 := false;
  3361. b512 := false;
  3362. //TG TODO delete
  3363. if instab[i].opcode = a_vtestps then
  3364. begin
  3365. b512 := b512;
  3366. end;
  3367. for j := 0 to length(InsTab[i].code) - 1 do
  3368. begin
  3369. case ord(InsTab[i].code[j]) of
  3370. 0: break;
  3371. 1,2,3: break;
  3372. 232: bEVEX := true;
  3373. 233: b512 := true;
  3374. 242: bVEX := true;
  3375. 244: b256 := true;
  3376. end;
  3377. end;
  3378. if bVEX or bEVEX then
  3379. begin
  3380. sInst := std_op2str[InsTab[i].opcode];
  3381. sI386 := '1';
  3382. sX8664 := '1';
  3383. if IF_X86_64 in InsTab[i].flags then
  3384. begin
  3385. sI386 := '0';
  3386. end;
  3387. if bEVEX then sAVX512 := '1'
  3388. else sAVX512 := '0';
  3389. sOperands := '';
  3390. for j := 0 to 3 do
  3391. begin
  3392. case InsTab[i].optypes[j] of
  3393. OT_XMMREG: sOperands := sOperands + 'XMMREG,';
  3394. OT_XMMREG_M: sOperands := sOperands + 'XMMREG_M,';
  3395. OT_XMMREG_MZ: sOperands := sOperands + 'XMMREG_MZ,';
  3396. OT_XMMREG_ER: sOperands := sOperands + 'XMMREG_ER,';
  3397. OT_XMMREG_SAE: sOperands := sOperands + 'XMMREG_SAE,';
  3398. OT_XMMRM: sOperands := sOperands + 'XMMRM,';
  3399. OT_XMMRM_MZ: sOperands := sOperands + 'XMMRM_MZ,';
  3400. OT_YMMREG: sOperands := sOperands + 'YMMREG,';
  3401. OT_YMMREG_M: sOperands := sOperands + 'YMMREG_M,';
  3402. OT_YMMREG_MZ: sOperands := sOperands + 'YMMREG_MZ,';
  3403. OT_YMMREG_ER: sOperands := sOperands + 'YMMREG_ER,';
  3404. OT_YMMREG_SAE: sOperands := sOperands + 'YMMREG_SAE,';
  3405. OT_YMMRM: sOperands := sOperands + 'YMMRM,';
  3406. OT_YMMRM_MZ: sOperands := sOperands + 'YMMRM_MZ,';
  3407. OT_ZMMREG: sOperands := sOperands + 'ZMMREG,';
  3408. OT_ZMMREG_M: sOperands := sOperands + 'ZMMREG_M,';
  3409. OT_ZMMREG_MZ: sOperands := sOperands + 'ZMMREG_MZ,';
  3410. OT_ZMMREG_ER: sOperands := sOperands + 'ZMMREG_ER,';
  3411. OT_ZMMREG_SAE: sOperands := sOperands + 'ZMMREG_SAE,';
  3412. OT_ZMMRM: sOperands := sOperands + 'ZMMRM,';
  3413. OT_ZMMRM_MZ: sOperands := sOperands + 'ZMMRM_MZ,';
  3414. OT_MEM32: sOperands := sOperands + 'MEM32,';
  3415. OT_MEM64: sOperands := sOperands + 'MEM64,';
  3416. OT_MEM128: sOperands := sOperands + 'MEM128,';
  3417. OT_MEM256: sOperands := sOperands + 'MEM256,';
  3418. OT_MEM512: sOperands := sOperands + 'MEM512,';
  3419. OT_REG32: sOperands := sOperands + 'REG32,';
  3420. OT_REG64: sOperands := sOperands + 'REG64,';
  3421. ot_rm_gpr or ot_bits32:
  3422. sOperands := sOperands + 'RM32,';
  3423. ot_rm_gpr or ot_bits64:
  3424. sOperands := sOperands + 'RM64,';
  3425. OT_XMEM32: sOperands := sOperands + 'XMEM32,';
  3426. OT_XMEM64: sOperands := sOperands + 'XMEM64,';
  3427. OT_YMEM32: sOperands := sOperands + 'YMEM32,';
  3428. OT_YMEM64: sOperands := sOperands + 'YMEM64,';
  3429. OT_IMM8: sOperands := sOperands + 'IMM8,';
  3430. OT_NONE: sOperands := sOperands + ',';
  3431. OT_BMEM32: if b512 then sOperands := sOperands + '16B32,'
  3432. else if b256 then sOperands := sOperands + '8B32,'
  3433. else sOperands := sOperands + '4B32,';
  3434. OT_BMEM64: if b512 then sOperands := sOperands + '8B32,'
  3435. else if b256 then sOperands := sOperands + '4B32,'
  3436. else sOperands := sOperands + '2B64,';
  3437. OT_KREG: sOperands := sOperands + 'KREG,';
  3438. OT_KREG_M: sOperands := sOperands + 'KREG_M,';
  3439. else sOperands := sOperands;
  3440. end;
  3441. end;
  3442. sOperands := copy(sOperands, 1, length(sOperands) - 1);
  3443. sl.Add(format('FOpCodeList.Add(''%s,%s,%s,%s,%s'');', [sInst, sI386, sX8664, sAVX512, sOperands]));
  3444. end;
  3445. end;
  3446. sl.Savetofile('/tmp/fpcavx512.txt');
  3447. // std_op2str
  3448. finally
  3449. FreeAndnil(sl);
  3450. end;
  3451. end;
  3452. class procedure TAsmTestGenerator.ListMemRefState;
  3453. var
  3454. i: integer;
  3455. mrsize: TMemRefSizeInfo;
  3456. opcode: tasmop;
  3457. sl: TStringList;
  3458. slEmpty: TStringList;
  3459. begin
  3460. BuildInsTabCache;
  3461. BuildInsTabMemRefSizeInfoCache;
  3462. slEmpty := TStringList.Create;
  3463. try
  3464. for mrsize := low(TMemRefSizeInfo) to high(TMemRefSizeInfo) do
  3465. begin
  3466. sl := TStringList.Create;
  3467. try
  3468. for opcode:=low(tasmop) to high(tasmop) do
  3469. begin
  3470. if InsTabMemRefSizeInfoCache^[opcode].MemRefSize = mrsize then
  3471. sl.add(format('%-25s: %s', [GetEnumName(Typeinfo(TMemRefSizeInfo), ord(mrsize)), std_op2str[opcode]]));
  3472. end;
  3473. sl.Sort;
  3474. if sl.Count > 0 then
  3475. begin
  3476. writeln;
  3477. writeln(sl.text);
  3478. end
  3479. else slEmpty.Add(GetEnumName(Typeinfo(TMemRefSizeInfo), ord(mrsize)));
  3480. finally
  3481. FreeAndNil(sl);
  3482. end;
  3483. end;
  3484. slEmpty.Sort;
  3485. writeln('');
  3486. writeln(slEmpty.Text);
  3487. finally
  3488. FreeAndNil(slEmpty);
  3489. end;
  3490. if assigned(instabcache) then
  3491. begin
  3492. dispose(instabcache);
  3493. instabcache:=nil;
  3494. end;
  3495. if assigned(InsTabMemRefSizeInfoCache) then
  3496. begin
  3497. dispose(InsTabMemRefSizeInfoCache);
  3498. InsTabMemRefSizeInfoCache:=nil;
  3499. end;
  3500. end;
  3501. end.