123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361 |
- {
- Copyright (C) <avx-testfile-generator> <Torsten Grundke>
- This source is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2 of the License, or (at your option)
- any later version.
- This code is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- details.
- A copy of the GNU General Public License is available on the World Wide Web
- at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
- to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- MA 02110-1301, USA.
- }
- {$mode objfpc}
- unit asmtestgenerator;
- interface
- uses BaseList, Classes;
- type
- TOpType = (otUnknown, otXMMReg, otXMMRM, otXMMRM16, otXMMRM8, otYMMReg, otYMMRM, otZMMReg, otZMMRM, otEAX, otRAX, otMem32,
- otMem8, otMem16, otMem64, otMem128, otMem256, otMem512, otREG64, otREG32, otREG16, otREG8, otRM32, otRM64, otIMM8,
- otXMEM32, otXMEM64, otYMEM32, otYMEM64, otZMEM32, otZMEM64,
- otB32, otB64, otKREG);
- TOperandListItem = class(TObject)
- private
- FOpActive: boolean;
- FOpNumber: integer;
- FOpTyp: TOpType;
- FValues: TStringList;
- public
- constructor Create;
- destructor Destroy; override;
- property OpNumber: integer read FOpNumber write FOpNumber;
- property OpTyp: TOpType read FOpTyp write FOpTyp;
- property OpActive: boolean read FOpActive write FOpActive;
- property Values: TStringList read FValues;
- end;
- TOperandList = class(TBaseList)
- private
- function GetItems(aIndex: integer): TOperandListItem;
- public
- function Add(aItem: TOperandListItem): integer;
- property Items[aIndex: integer]: TOperandListItem read GetItems;
- end;
- { TAsmTestGenerator }
- TAsmTestGenerator = class(TObject)
- private
- FReg8 : TStringList;
- FReg16 : TStringList;
- FReg32Base : TStringList;
- FReg32Index : TStringList;
- FReg64Base : TStringList;
- FReg64Index : TStringList;
- FReg6432Base : TStringList;
- FReg6432Index : TStringList;
- FReg32XMMIndex : TStringList;
- FReg32YMMIndex : TStringList;
- FReg32ZMMIndex : TStringList;
- FReg64XMMIndex : TStringList;
- FReg64YMMIndex : TStringList;
- FReg64ZMMIndex : TStringList;
- FRegKREG : TStringList;
- Fx64: boolean;
- FAVX512: boolean;
- FSAE: boolean;
- procedure MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
- procedure VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
- function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
- public
- constructor Create;
- destructor Destroy; override;
- class procedure CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
- class procedure CalcTestInstFile;
- property x64: boolean read Fx64;
- end;
- implementation
- uses SysUtils, Dialogs;
- const
- instabentries = {$i ../../../compiler/x86_64/x8664nop.inc}
- type
- TAsmOp={$i ../../../compiler/x86_64/x8664op.inc}
- op2strtable=array[tasmop] of string[16];
- {Instruction flags }
- tinsflag = (
- { please keep these in order and in sync with IF_SMASK }
- IF_SM, { size match first two operands }
- IF_SM2,
- IF_SB, { unsized operands can't be non-byte }
- IF_SW, { unsized operands can't be non-word }
- IF_SD, { unsized operands can't be nondword }
- { unsized argument spec }
- { please keep these in order and in sync with IF_ARMASK }
- IF_AR0, { SB, SW, SD applies to argument 0 }
- IF_AR1, { SB, SW, SD applies to argument 1 }
- IF_AR2, { SB, SW, SD applies to argument 2 }
- IF_PRIV, { it's a privileged instruction }
- IF_SMM, { it's only valid in SMM }
- IF_PROT, { it's protected mode only }
- IF_NOX86_64, { removed instruction in x86_64 }
- IF_UNDOC, { it's an undocumented instruction }
- IF_FPU, { it's an FPU instruction }
- IF_MMX, { it's an MMX instruction }
- { it's a 3DNow! instruction }
- IF_3DNOW,
- { it's a SSE (KNI, MMX2) instruction }
- IF_SSE,
- { SSE2 instructions }
- IF_SSE2,
- { SSE3 instructions }
- IF_SSE3,
- { SSE64 instructions }
- IF_SSE64,
- { SVM instructions }
- IF_SVM,
- { SSE4 instructions }
- IF_SSE4,
- IF_SSSE3,
- IF_SSE41,
- IF_SSE42,
- IF_MOVBE,
- IF_CLMUL,
- IF_AVX,
- IF_AVX2,
- IF_AVX512,
- IF_BMI1,
- IF_BMI2,
- { Intel ADX (Multi-Precision Add-Carry Instruction Extensions) }
- IF_ADX,
- IF_16BITONLY,
- IF_FMA,
- IF_FMA4,
- IF_TSX,
- IF_RAND,
- IF_XSAVE,
- IF_PREFETCHWT1,
- { mask for processor level }
- { please keep these in order and in sync with IF_PLEVEL }
- IF_8086, { 8086 instruction }
- IF_186, { 186+ instruction }
- IF_286, { 286+ instruction }
- IF_386, { 386+ instruction }
- IF_486, { 486+ instruction }
- IF_PENT, { Pentium instruction }
- IF_P6, { P6 instruction }
- IF_KATMAI, { Katmai instructions }
- IF_WILLAMETTE, { Willamette instructions }
- IF_PRESCOTT, { Prescott instructions }
- IF_X86_64,
- IF_SANDYBRIDGE, { Sandybridge-specific instruction }
- IF_NEC, { NEC V20/V30 instruction }
- { the following are not strictly part of the processor level, because
- they are never used standalone, but always in combination with a
- separate processor level flag. Therefore, they use bits outside of
- IF_PLEVEL, otherwise they would mess up the processor level they're
- used in combination with.
- The following combinations are currently used:
- [IF_AMD, IF_P6],
- [IF_CYRIX, IF_486],
- [IF_CYRIX, IF_PENT],
- [IF_CYRIX, IF_P6] }
- IF_CYRIX, { Cyrix, Centaur or VIA-specific instruction }
- IF_AMD, { AMD-specific instruction }
- { added flags }
- IF_PRE, { it's a prefix instruction }
- IF_PASS2, { if the instruction can change in a second pass }
- IF_IMM4, { immediate operand is a nibble (must be in range [0..15]) }
- IF_IMM3, { immediate operand is a triad (must be in range [0..7]) }
- IF_BCST2,
- IF_BCST4,
- IF_BCST8,
- IF_BCST16,
- IF_T2, { disp8 - tuple - 2 }
- IF_T4, { disp8 - tuple - 4 }
- IF_T8, { disp8 - tuple - 8 }
- IF_T1S, { disp8 - tuple - 1 scalar }
- IF_T1S8,
- IF_T1S16,
- IF_T1F32,
- IF_T1F64,
- IF_TMDDUP,
- IF_TFV, { disp8 - tuple - full vector }
- IF_TFVM, { disp8 - tuple - full vector memory }
- IF_TQVM,
- IF_TMEM128,
- IF_THV,
- IF_THVM,
- IF_TOVM,
- IF_SCL32,
- IF_SCL64
- );
- tinsflags=set of tinsflag;
- tinsentry=packed record
- opcode : tasmop;
- ops : byte;
- //optypes : array[0..max_operands-1] of longint;
- optypes : array[0..3] of int64; //TG
- code : array[0..11] of char;
- flags : tinsflags;
- end;
- pinsentry=^tinsentry;
- const
- OT_NONE = $00000000;
- { Bits 0..7: sizes }
- OT_BITS8 = $00000001;
- OT_BITS16 = $00000002;
- OT_BITS32 = $00000004;
- OT_BITS64 = $00000008; { x86_64 and FPU }
- //OT_BITS128 = $10000000; { 16 byte SSE }
- //OT_BITS256 = $20000000; { 32 byte AVX }
- //OT_BITS512 = $40000000; { 64 byte AVX512 }
- OT_BITS128 = $20000000; { 16 byte SSE }
- OT_BITS256 = $40000000; { 32 byte AVX }
- OT_BITS512 = $80000000; { 64 byte AVX512 }
- OT_VECTORMASK = $1000000000; { OPTIONAL VECTORMASK AVX512}
- OT_VECTORZERO = $2000000000; { OPTIONAL ZERO-FLAG AVX512}
- OT_VECTORBCST = $4000000000; { BROADCAST-MEM-FLAG AVX512}
- OT_VECTORSAE = $8000000000; { OPTIONAL SAE-FLAG AVX512}
- OT_VECTORER = $10000000000; { OPTIONAL ER-FLAG-FLAG AVX512}
- OT_BITSB32 = OT_BITS32 or OT_VECTORBCST;
- OT_BITSB64 = OT_BITS64 or OT_VECTORBCST;
- OT_VECTOR_EXT_MASK = OT_VECTORMASK or OT_VECTORZERO or OT_VECTORBCST;
- OT_BITS80 = $00000010; { FPU only }
- OT_FAR = $00000020; { this means 16:16 or 16:32, like in CALL/JMP }
- OT_NEAR = $00000040;
- OT_SHORT = $00000080;
- { TODO: FAR/NEAR/SHORT are sizes too, they should be included into size mask,
- but this requires adjusting the opcode table }
- //OT_SIZE_MASK = $3000001F; { all the size attributes }
- OT_SIZE_MASK = $E000001F; { all the size attributes }
- OT_NON_SIZE = int64(not int64(OT_SIZE_MASK));
- { Bits 8..11: modifiers }
- OT_SIGNED = $00000100; { the operand need to be signed -128-127 }
- OT_TO = $00000200; { reverse effect in FADD, FSUB &c }
- OT_COLON = $00000400; { operand is followed by a colon }
- OT_MODIFIER_MASK = $00000F00;
- { Bits 12..15: type of operand }
- OT_REGISTER = $00001000;
- OT_IMMEDIATE = $00002000;
- OT_MEMORY = $0000C000; { always includes 'OT_REGMEM' bit as well }
- OT_REGMEM = $00008000; { for r/m, ie EA, operands }
- OT_TYPE_MASK = OT_REGISTER or OT_IMMEDIATE or OT_MEMORY or OT_REGMEM;
- OT_REGNORM = OT_REGISTER or OT_REGMEM; { 'normal' reg, qualifies as EA }
- { Bits 20..22, 24..26: register classes
- otf_* consts are not used alone, only to build other constants. }
- otf_reg_cdt = $00100000;
- otf_reg_gpr = $00200000;
- otf_reg_sreg = $00400000;
- otf_reg_k = $00800000;
- otf_reg_fpu = $01000000;
- otf_reg_mmx = $02000000;
- otf_reg_xmm = $04000000;
- otf_reg_ymm = $08000000;
- otf_reg_zmm = $10000000;
- otf_reg_extra_mask = $0F000000;
- { Bits 16..19: subclasses, meaning depends on classes field }
- otf_sub0 = $00010000;
- otf_sub1 = $00020000;
- otf_sub2 = $00040000;
- otf_sub3 = $00080000;
- OT_REG_SMASK = otf_sub0 or otf_sub1 or otf_sub2 or otf_sub3;
- //OT_REG_EXTRA_MASK = $0F000000;
- OT_REG_EXTRA_MASK = $1F000000;
- OT_REG_TYPMASK = otf_reg_cdt or otf_reg_gpr or otf_reg_sreg or otf_reg_k or otf_reg_extra_mask;
- { register class 0: CRx, DRx and TRx }
- OT_REG_CDT = OT_REGISTER or otf_reg_cdt or OT_BITS64;
- OT_REG_CREG = OT_REG_CDT or otf_sub0; { CRn }
- OT_REG_DREG = OT_REG_CDT or otf_sub1; { DRn }
- OT_REG_TREG = OT_REG_CDT or otf_sub2; { TRn }
- OT_REG_CR4 = OT_REG_CDT or otf_sub3; { CR4 (Pentium only) }
- { register class 1: general-purpose registers }
- OT_REG_GPR = OT_REGNORM or otf_reg_gpr;
- OT_RM_GPR = OT_REGMEM or otf_reg_gpr;
- OT_REG8 = OT_REG_GPR or OT_BITS8; { 8-bit GPR }
- OT_REG16 = OT_REG_GPR or OT_BITS16;
- OT_REG32 = OT_REG_GPR or OT_BITS32;
- OT_REG64 = OT_REG_GPR or OT_BITS64;
- { GPR subclass 0: accumulator: AL, AX, EAX or RAX }
- OT_REG_ACCUM = OT_REG_GPR or otf_sub0;
- OT_REG_AL = OT_REG_ACCUM or OT_BITS8;
- OT_REG_AX = OT_REG_ACCUM or OT_BITS16;
- OT_REG_EAX = OT_REG_ACCUM or OT_BITS32;
- OT_REG_RAX = OT_REG_ACCUM or OT_BITS64;
- { GPR subclass 1: counter: CL, CX, ECX or RCX }
- OT_REG_COUNT = OT_REG_GPR or otf_sub1;
- OT_REG_CL = OT_REG_COUNT or OT_BITS8;
- OT_REG_CX = OT_REG_COUNT or OT_BITS16;
- OT_REG_ECX = OT_REG_COUNT or OT_BITS32;
- OT_REG_RCX = OT_REG_COUNT or OT_BITS64;
- { GPR subclass 2: data register: DL, DX, EDX or RDX }
- OT_REG_DX = OT_REG_GPR or otf_sub2 or OT_BITS16;
- OT_REG_EDX = OT_REG_GPR or otf_sub2 or OT_BITS32;
- { register class 2: Segment registers }
- OT_REG_SREG = OT_REGISTER or otf_reg_sreg or OT_BITS16;
- OT_REG_CS = OT_REG_SREG or otf_sub0; { CS }
- OT_REG_DESS = OT_REG_SREG or otf_sub1; { DS, ES, SS (non-CS 86 registers) }
- OT_REG_FSGS = OT_REG_SREG or otf_sub2; { FS, GS (386 extended registers) }
- { register class 3: FPU registers }
- OT_FPUREG = OT_REGISTER or otf_reg_fpu;
- OT_FPU0 = OT_FPUREG or otf_sub0; { FPU stack register zero }
- { register class 4: MMX (both reg and r/m) }
- OT_MMXREG = OT_REGNORM or otf_reg_mmx;
- OT_MMXRM = OT_REGMEM or otf_reg_mmx;
- { register class 5: XMM (both reg and r/m) }
- OT_XMMREG = OT_REGNORM or otf_reg_xmm;
- OT_XMMRM = OT_REGMEM or otf_reg_xmm;
- OT_XMEM32 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS32;
- OT_XMEM32_M = OT_XMEM32 or OT_VECTORMASK;
- OT_XMEM64 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS64;
- OT_XMEM64_M = OT_XMEM64 or OT_VECTORMASK;
- OT_XMMREG_M = OT_XMMREG or OT_VECTORMASK;
- OT_XMMREG_MZ = OT_XMMREG or OT_VECTORMASK or OT_VECTORZERO;
- OT_XMMRM_MZ = OT_XMMRM or OT_VECTORMASK or OT_VECTORZERO;
- OT_XMMREG_SAE = OT_XMMREG or OT_VECTORSAE;
- OT_XMMRM_SAE = OT_XMMRM or OT_VECTORSAE;
- OT_XMMREG_ER = OT_XMMREG or OT_VECTORER;
- OT_XMMRM_ER = OT_XMMRM or OT_VECTORER;
- { register class 5: YMM (both reg and r/m) }
- OT_YMMREG = OT_REGNORM or otf_reg_ymm;
- OT_YMMRM = OT_REGMEM or otf_reg_ymm;
- OT_YMEM32 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS32;
- OT_YMEM32_M = OT_YMEM32 or OT_VECTORMASK;
- OT_YMEM64 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS64;
- OT_YMEM64_M = OT_YMEM64 or OT_VECTORMASK;
- OT_YMMREG_M = OT_YMMREG or OT_VECTORMASK;
- OT_YMMREG_MZ = OT_YMMREG or OT_VECTORMASK or OT_VECTORZERO;
- OT_YMMRM_MZ = OT_YMMRM or OT_VECTORMASK or OT_VECTORZERO;
- OT_YMMREG_SAE = OT_YMMREG or OT_VECTORSAE;
- OT_YMMRM_SAE = OT_YMMRM or OT_VECTORSAE;
- OT_YMMREG_ER = OT_YMMREG or OT_VECTORER;
- OT_YMMRM_ER = OT_YMMRM or OT_VECTORER;
- { register class 5: ZMM (both reg and r/m) }
- OT_ZMMREG = OT_REGNORM or otf_reg_zmm;
- OT_ZMMRM = OT_REGMEM or otf_reg_zmm;
- OT_ZMEM32 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS32;
- OT_ZMEM32_M = OT_ZMEM32 or OT_VECTORMASK;
- OT_ZMEM64 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS64;
- OT_ZMEM64_M = OT_ZMEM64 or OT_VECTORMASK;
- OT_ZMMREG_M = OT_ZMMREG or OT_VECTORMASK;
- OT_ZMMREG_MZ = OT_ZMMREG or OT_VECTORMASK or OT_VECTORZERO;
- OT_ZMMRM_MZ = OT_ZMMRM or OT_VECTORMASK or OT_VECTORZERO;
- OT_ZMMREG_SAE = OT_ZMMREG or OT_VECTORSAE;
- OT_ZMMRM_SAE = OT_ZMMRM or OT_VECTORSAE;
- OT_ZMMREG_ER = OT_ZMMREG or OT_VECTORER;
- OT_ZMMRM_ER = OT_ZMMRM or OT_VECTORER;
- OT_KREG = OT_REGNORM or otf_reg_k;
- OT_KREG_M = OT_KREG or OT_VECTORMASK;
- { Vector-Memory operands }
- OT_VMEM_ANY = OT_XMEM32 or OT_XMEM64 or OT_YMEM32 or OT_YMEM64 or OT_ZMEM32 or OT_ZMEM64;
- { Memory operands }
- OT_MEM8 = OT_MEMORY or OT_BITS8;
- OT_MEM16 = OT_MEMORY or OT_BITS16;
- OT_MEM16_M = OT_MEM16 or OT_VECTORMASK;
- OT_MEM32 = OT_MEMORY or OT_BITS32;
- OT_MEM32_M = OT_MEMORY or OT_BITS32 or OT_VECTORMASK;
- OT_BMEM32 = OT_MEMORY or OT_BITS32 or OT_VECTORBCST;
- OT_BMEM32_SAE= OT_MEMORY or OT_BITS32 or OT_VECTORBCST or OT_VECTORSAE;
- OT_MEM64 = OT_MEMORY or OT_BITS64;
- OT_MEM64_M = OT_MEMORY or OT_BITS64 or OT_VECTORMASK;
- OT_BMEM64 = OT_MEMORY or OT_BITS64 or OT_VECTORBCST;
- OT_BMEM64_SAE= OT_MEMORY or OT_BITS64 or OT_VECTORBCST or OT_VECTORSAE;
- OT_MEM128 = OT_MEMORY or OT_BITS128;
- OT_MEM128_M = OT_MEMORY or OT_BITS128 or OT_VECTORMASK;
- OT_MEM256 = OT_MEMORY or OT_BITS256;
- OT_MEM256_M = OT_MEMORY or OT_BITS256 or OT_VECTORMASK;
- OT_MEM512 = OT_MEMORY or OT_BITS512;
- OT_MEM512_M = OT_MEMORY or OT_BITS512 or OT_VECTORMASK;
- OT_MEM80 = OT_MEMORY or OT_BITS80;
- OT_MEM_OFFS = OT_MEMORY or otf_sub0; { special type of EA }
- { simple [address] offset }
- { Matches any type of r/m operand }
- OT_MEMORY_ANY = OT_MEMORY or OT_RM_GPR or OT_XMMRM or OT_MMXRM or OT_YMMRM or OT_ZMMRM or OT_REG_EXTRA_MASK;
- { Immediate operands }
- OT_IMM8 = OT_IMMEDIATE or OT_BITS8;
- OT_IMM16 = OT_IMMEDIATE or OT_BITS16;
- OT_IMM32 = OT_IMMEDIATE or OT_BITS32;
- OT_IMM64 = OT_IMMEDIATE or OT_BITS64;
- OT_ONENESS = otf_sub0; { special type of immediate operand }
- OT_UNITY = OT_IMMEDIATE or OT_ONENESS; { for shift/rotate instructions }
- std_op2str:op2strtable={$i ../../../compiler/x86_64/x8664int.inc}
- InsTab:array[0..instabentries-1] of TInsEntry={$i ../../../compiler/x86_64/x8664tab.inc}
- { TOperandListItem }
- constructor TOperandListItem.Create;
- begin
- inherited;
- FOpActive := false;
- FOpNumber := -1;
- FOpTyp := otUnknown;
- FValues := TStringList.Create;
- end;
- destructor TOperandListItem.Destroy;
- begin
- FreeAndNil(FValues);
- inherited;
- end;
- { TOperandList }
- function TOperandList.Add(aItem: TOperandListItem): integer;
- begin
- result := FList.Add(aItem);
- end;
- function TOperandList.GetItems(aIndex: integer): TOperandListItem;
- begin
- result := TOperandListItem(FList[aIndex]);
- end;
- { TAsmTestGenerator }
- function TAsmTestGenerator.InternalCalcTestData(const aInst, aOp1, aOp2, aOp3,
- aOp4: String): TStringList;
- var
- i: integer;
- Item: TOperandListItem;
- OItem1: TOperandListItem;
- OItem2: TOperandListItem;
- OItem3: TOperandListItem;
- OItem4: TOperandListItem;
- il_Op: integer;
- il_Op1: integer;
- il_Op2: integer;
- il_Op3: integer;
- il_Op4: integer;
- sSuffix: string;
- sl_Operand: String;
- sl_Inst : String;
- sl_RegCombi: String;
- sl_Prefix: String;
- UsePrefix: boolean;
- il_Operands: integer;
- UsedParams: cardinal;
- UseDefault: boolean;
- sl_RegCombi1: string;
- sl_RegCombi2: string;
- sl_RegCombi3: string;
- function PrepareOperandTyp(const aTyp: String): String;
- begin
- result := aTyp;
- if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
- if result = 'XMMRM128' then result := 'XMMRM';
- if result = 'YMMRM256' then result := 'YMMRM';
- end;
- begin
- result := TStringList.Create;
- OItem1 := TOperandListItem.Create;
- try
- OItem2 := TOperandListItem.Create;
- try
- OItem3 := TOperandListItem.Create;
- try
- OItem4 := TOperandListItem.Create;
- try
- UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
- (UpperCase(aInst) = 'VCVTPD2PS') OR
- (UpperCase(aInst) = 'VCVTSI2SD') OR
- (UpperCase(aInst) = 'VCVTSI2SS') OR
- (UpperCase(aInst) = 'VCVTTPD2DQ') or
- (UpperCase(aInst) = 'VPMOVZXWQ') or
- (UpperCase(aInst) = 'VCVTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTTPD2UDQ') or
- (UpperCase(aInst) = 'VCVTUQQ2PS') or
- (UpperCase(aInst) = 'VCVTQQ2PS') or
- (UpperCase(aInst) = 'VCVTUSI2SD') or
- (UpperCase(aInst) = 'VCVTUSI2SS') or
- (UpperCase(aInst) = 'VFPCLASSPD') or
- (UpperCase(aInst) = 'VFPCLASSPS') or
- (UpperCase(aInst) = 'VCMPSS')
- ;
- for il_Op := 1 to 4 do
- begin
- sl_Prefix := '';
- case il_Op of
- 1: begin
- Item := OItem1;
- sl_Operand := aOp1;
- end;
- 2: begin
- Item := OItem2;
- sl_Operand := aOp2;
- end;
- 3: begin
- Item := OItem3;
- sl_Operand := aOp3;
- end;
- 4: begin
- Item := OItem4;
- sl_Operand := aOp4;
- end;
- end;
- sl_Operand := PrepareOperandTyp(sl_Operand);
- if (AnsiSameText(sl_Operand, 'XMMREG')) or
- (AnsiSameText(sl_Operand, 'XMMREG_M')) or
- (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMReg;
- Item.OpActive := true;
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM1' + sSuffix);
- Item.Values.Add('XMM2' + sSuffix);
- Item.Values.Add('XMM3' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM5' + sSuffix);
- Item.Values.Add('XMM6' + sSuffix);
- Item.Values.Add('XMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM9' + sSuffix);
- Item.Values.Add('XMM18' + sSuffix);
- Item.Values.Add('XMM27' + sSuffix);
- Item.Values.Add('XMM31' + sSuffix);
- if sSuffix <> '' then
- begin
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM9');
- Item.Values.Add('XMM18');
- Item.Values.Add('XMM27');
- Item.Values.Add('XMM31');
- end;
- end
- else
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM8' + sSuffix);
- Item.Values.Add('XMM12' + sSuffix);
- Item.Values.Add('XMM15' + sSuffix);
- if sSuffix <> '' then
- begin
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM4');
- Item.Values.Add('XMM8');
- Item.Values.Add('XMM12');
- Item.Values.Add('XMM15');
- end;
- end;
- end;
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM')) or
- (AnsiSameText(sl_Operand, 'XMMRM_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM1' + sSuffix);
- Item.Values.Add('XMM2' + sSuffix);
- Item.Values.Add('XMM3' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM5' + sSuffix);
- Item.Values.Add('XMM6' + sSuffix);
- Item.Values.Add('XMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM9' + sSuffix);
- Item.Values.Add('XMM9');
- Item.Values.Add('XMM18' + sSuffix);
- Item.Values.Add('XMM18');
- Item.Values.Add('XMM27' + sSuffix);
- Item.Values.Add('XMM27');
- Item.Values.Add('XMM31' + sSuffix);
- Item.Values.Add('XMM31');
- end
- else
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM4');
- Item.Values.Add('XMM8' + sSuffix);
- Item.Values.Add('XMM8');
- Item.Values.Add('XMM12' + sSuffix);
- Item.Values.Add('XMM15');
- Item.Values.Add('XMM15' + sSuffix);
- end;
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM8;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'byte ';
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM1' + sSuffix);
- Item.Values.Add('XMM2' + sSuffix);
- Item.Values.Add('XMM3' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM5' + sSuffix);
- Item.Values.Add('XMM6' + sSuffix);
- Item.Values.Add('XMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM9' + sSuffix);
- Item.Values.Add('XMM9');
- Item.Values.Add('XMM18' + sSuffix);
- Item.Values.Add('XMM18');
- Item.Values.Add('XMM27' + sSuffix);
- Item.Values.Add('XMM27');
- Item.Values.Add('XMM31' + sSuffix);
- Item.Values.Add('XMM31');
- end
- else
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM4');
- Item.Values.Add('XMM8' + sSuffix);
- Item.Values.Add('XMM8');
- Item.Values.Add('XMM12' + sSuffix);
- Item.Values.Add('XMM12');
- Item.Values.Add('XMM15' + sSuffix);
- Item.Values.Add('XMM15');
- end;
- //Item.Values.Add('[RIP]');
- //Item.Values.Add('[RIP + 16]');
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMMRM16;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'word ';
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM1' + sSuffix);
- Item.Values.Add('XMM2' + sSuffix);
- Item.Values.Add('XMM3' + sSuffix);
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM5' + sSuffix);
- Item.Values.Add('XMM6' + sSuffix);
- Item.Values.Add('XMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM9' + sSuffix);
- Item.Values.Add('XMM9');
- Item.Values.Add('XMM18' + sSuffix);
- Item.Values.Add('XMM18');
- Item.Values.Add('XMM27' + sSuffix);
- Item.Values.Add('XMM27');
- Item.Values.Add('XMM31' + sSuffix);
- Item.Values.Add('XMM31');
- end
- else
- begin
- Item.Values.Add('XMM0' + sSuffix);
- Item.Values.Add('XMM0');
- Item.Values.Add('XMM4' + sSuffix);
- Item.Values.Add('XMM4');
- Item.Values.Add('XMM8' + sSuffix);
- Item.Values.Add('XMM8');
- Item.Values.Add('XMM12' + sSuffix);
- Item.Values.Add('XMM12');
- Item.Values.Add('XMM15' + sSuffix);
- Item.Values.Add('XMM15');
- end;
- //Item.Values.Add('[RIP]');
- //Item.Values.Add('[RIP + 16]');
- MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if (AnsiSameText(sl_Operand, 'YMMREG')) or
- (AnsiSameText(sl_Operand, 'YMMREG_M')) or
- (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMMReg;
- Item.OpActive := true;
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM1' + sSuffix);
- Item.Values.Add('YMM2' + sSuffix);
- Item.Values.Add('YMM3' + sSuffix);
- Item.Values.Add('YMM4' + sSuffix);
- Item.Values.Add('YMM5' + sSuffix);
- Item.Values.Add('YMM6' + sSuffix);
- Item.Values.Add('YMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM9' + sSuffix);
- Item.Values.Add('YMM18' + sSuffix);
- Item.Values.Add('YMM27' + sSuffix);
- Item.Values.Add('YMM31' + sSuffix);
-
- if sSuffix <> '' then
- begin
- Item.Values.Add('YMM0');
- Item.Values.Add('YMM9');
- Item.Values.Add('YMM18');
- Item.Values.Add('YMM27');
- Item.Values.Add('YMM31');
- end;
- end
- else
- begin
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM4' + sSuffix);
- Item.Values.Add('YMM8' + sSuffix);
- Item.Values.Add('YMM12' + sSuffix);
- Item.Values.Add('YMM15' + sSuffix);
- if sSuffix <> '' then
- begin
- Item.Values.Add('YMM0');
- Item.Values.Add('YMM4');
- Item.Values.Add('YMM8');
- Item.Values.Add('YMM12');
- Item.Values.Add('YMM15');
- end;
- end;
- end;
- end
- else if (AnsiSameText(sl_Operand, 'YMMRM')) or
- (AnsiSameText(sl_Operand, 'YMMRM_M')) or
- (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM1' + sSuffix);
- Item.Values.Add('YMM2' + sSuffix);
- Item.Values.Add('YMM3' + sSuffix);
- Item.Values.Add('YMM4' + sSuffix);
- Item.Values.Add('YMM5' + sSuffix);
- Item.Values.Add('YMM6' + sSuffix);
- Item.Values.Add('YMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM9' + sSuffix);
- Item.Values.Add('YMM18' + sSuffix);
- Item.Values.Add('YMM27' + sSuffix);
- Item.Values.Add('YMM31' + sSuffix);
- if sSuffix <> '' then
- begin
- Item.Values.Add('YMM0');
- Item.Values.Add('YMM9');
- Item.Values.Add('YMM18');
- Item.Values.Add('YMM27');
- Item.Values.Add('YMM31');
- end;
- end
- else
- begin
- Item.Values.Add('YMM0' + sSuffix);
- Item.Values.Add('YMM4' + sSuffix);
- Item.Values.Add('YMM8' + sSuffix);
- Item.Values.Add('YMM12' + sSuffix);
- Item.Values.Add('YMM15' + sSuffix);
- if sSuffix <> '' then
- begin
- Item.Values.Add('YMM0');
- Item.Values.Add('YMM4');
- Item.Values.Add('YMM8');
- Item.Values.Add('YMM12');
- Item.Values.Add('YMM15');
- end;
- end;
- MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
- (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMMReg;
- Item.OpActive := true;
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM1' + sSuffix);
- Item.Values.Add('ZMM2' + sSuffix);
- Item.Values.Add('ZMM3' + sSuffix);
- Item.Values.Add('ZMM4' + sSuffix);
- Item.Values.Add('ZMM5' + sSuffix);
- Item.Values.Add('ZMM6' + sSuffix);
- Item.Values.Add('ZMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM9' + sSuffix);
- Item.Values.Add('ZMM18' + sSuffix);
- Item.Values.Add('ZMM27' + sSuffix);
- Item.Values.Add('ZMM31' + sSuffix);
- if sSuffix <> '' then
- begin
- Item.Values.Add('ZMM0');
- Item.Values.Add('ZMM9');
- Item.Values.Add('ZMM18');
- Item.Values.Add('ZMM27');
- Item.Values.Add('ZMM31');
- end;
- end
- else
- begin
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM4' + sSuffix);
- Item.Values.Add('ZMM8' + sSuffix);
- Item.Values.Add('ZMM12' + sSuffix);
- Item.Values.Add('ZMM15' + sSuffix);
- end;
- end;
- end
- else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
- (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
- (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
- (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
- then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMMRM;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- sSuffix := '';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
- else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
- else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM1' + sSuffix);
- Item.Values.Add('ZMM2' + sSuffix);
- Item.Values.Add('ZMM3' + sSuffix);
- Item.Values.Add('ZMM4' + sSuffix);
- Item.Values.Add('ZMM5' + sSuffix);
- Item.Values.Add('ZMM6' + sSuffix);
- Item.Values.Add('ZMM7' + sSuffix);
- if x64 then
- begin
- Item.Values.Clear;
- if FAVX512 then
- begin
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM9' + sSuffix);
- Item.Values.Add('ZMM18' + sSuffix);
- Item.Values.Add('ZMM27' + sSuffix);
- Item.Values.Add('ZMM31' + sSuffix);
- if sSuffix <> '' then
- begin
- Item.Values.Add('ZMM0');
- Item.Values.Add('ZMM9');
- Item.Values.Add('ZMM18');
- Item.Values.Add('ZMM27');
- Item.Values.Add('ZMM31');
- end;
- end
- else
- begin
- Item.Values.Add('ZMM0' + sSuffix);
- Item.Values.Add('ZMM4' + sSuffix);
- Item.Values.Add('ZMM8' + sSuffix);
- Item.Values.Add('ZMM12' + sSuffix);
- Item.Values.Add('ZMM15' + sSuffix);
- end;
- MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'MEM8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM8;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'byte ';
-
- sSuffix := '';
-
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'MEM16') or
- AnsiSameText(sl_Operand, 'MEM16_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM16;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'word ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'MEM32') or
- AnsiSameText(sl_Operand, 'MEM32_M') or
- AnsiSameText(sl_Operand, 'MEM32_MZ') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'dword ';
- sSuffix := '';
-
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM64')) or
- (AnsiSameText(sl_Operand, 'MEM64_M')) or
- (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'qword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM128')) or
- (AnsiSameText(sl_Operand, 'MEM128_M')) or
- (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM128;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM256')) or
- (AnsiSameText(sl_Operand, 'MEM256_M')) or
- (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM256;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if (AnsiSameText(sl_Operand, 'MEM512')) or
- (AnsiSameText(sl_Operand, 'MEM512_M')) or
- (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otMEM512;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'REG8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG8;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg8);
- end
- else Item.Values.AddStrings(FReg8);
- end
- else if AnsiSameText(sl_Operand, 'REG16') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG16;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg16);
- end
- else Item.Values.AddStrings(FReg16);
- end
- else if AnsiSameText(sl_Operand, 'REG32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG32;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg32Base);
- end
- else Item.Values.AddStrings(FReg32Base);
- end
- else if AnsiSameText(sl_Operand, 'REG64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otREG64;
- Item.OpActive := true;
- if x64 then
- begin
- Item.Values.AddStrings(FReg64Base);
- end;
- end
- else if AnsiSameText(sl_Operand, 'RM32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otRM32;
- Item.OpActive := true;
- Item.Values.AddStrings(FReg32Base);
- if UsePrefix then sl_Prefix := 'dword ';
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'RM64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otRM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'qword ';
- if x64 then
- begin
- Item.Values.AddStrings(FReg64Base);
- MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'IMM8') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otIMM8;
- Item.OpActive := true;
- Item.Values.Add('0');
- end
- else if AnsiSameText(sl_Operand, 'XMEM32') or
- AnsiSameText(sl_Operand, 'XMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'oword ';
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'XMEM64') or
- AnsiSameText(sl_Operand, 'XMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otXMEM64;
- Item.OpActive := true;
- //if UsePrefix then sl_Prefix := 'oword ';
- //
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'YMEM32') or
- AnsiSameText(sl_Operand, 'YMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'YMEM64') or
- AnsiSameText(sl_Operand, 'YMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otYMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'yword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'ZMEM32') or
- AnsiSameText(sl_Operand, 'ZMEM32_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMEM32;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, 'ZMEM64') or
- AnsiSameText(sl_Operand, 'ZMEM64_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otZMEM64;
- Item.OpActive := true;
- if UsePrefix then sl_Prefix := 'zword ';
- //if x64 then
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
- //end
- //else
- //begin
- // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
- //end;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if x64 then
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
- end
- else
- begin
- VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
- if sSuffix <> '' then
- VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
- end;
- end
- else if AnsiSameText(sl_Operand, '2B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '4B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '8B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '16B32') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB32;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '2B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '4B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '8B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, '16B64') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otB64;
- Item.OpActive := true;
- if x64 then
- begin
- MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
- //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
- end
- else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
- end
- else if AnsiSameText(sl_Operand, 'KREG') or
- AnsiSameText(sl_Operand, 'KREG_M') then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otKREG;
- Item.OpActive := true;
- sSuffix := '';
- if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
- if UsePrefix then sl_Prefix := '';
- for i := 0 to FRegKREG.Count - 1 do
- Item.Values.Add(FRegKREG[i] + sSuffix);
- end
- else if trim(sl_Operand) = '' then
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otUnknown;
- Item.OpActive := false;
- Item.Values.Add('');
- end
- else
- begin
- Item.OpNumber := il_Op;
- Item.OpTyp := otUnknown;
- Item.OpActive := false;
- Item.Values.Add('?' + sl_Operand);
- end
- end;
- sl_RegCombi := '';
- il_Operands := 0;
- UsedParams := 0;
- if OItem1.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 1;
- end;
- if OItem2.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 2;
- end;
- if OItem3.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 4;
- end;
- if OItem4.OpActive then
- begin
- inc(il_Operands);
- UsedParams := UsedParams or 8;
- end;
- case il_Operands of
- 1: UseDefault := UsedParams <> 1;
- 2: UseDefault := UsedParams <> 3;
- 3: UseDefault := UsedParams <> 7;
- 4: UseDefault := UsedParams <> 15;
- else UseDefault := true;
- end;
- //UseDefault := true;
- if UseDefault then
- begin
- sl_Inst := format('%-20s', [aInst]);
- for il_Op1 := 0 to OItem1.Values.Count - 1 do
- begin
- for il_Op2 := 0 to OItem2.Values.Count - 1 do
- begin
- for il_Op3 := 0 to OItem3.Values.Count - 1 do
- begin
- for il_Op4 := 0 to OItem4.Values.Count - 1 do
- begin
- sl_RegCombi := '';
- if OItem1.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
- end;
- if OItem2.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
- end;
- if OItem3.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
- end;
- if OItem4.OpActive then
- begin
- if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
- sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
- end;
- if sl_RegCombi <> '' then
- begin
- //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
- result.Add(sl_Inst + sl_RegCombi);
- sl_RegCombi := '';
- end;
- end;
- end;
- end;
- end;
- end
- else
- begin
- sl_Inst := format('%-20s', [aInst]);
- for il_Op1 := 0 to OItem1.Values.Count - 1 do
- begin
- if OItem1.OpActive then
- begin
- sl_RegCombi1 := OItem1.Values[il_Op1];
- end
- else sl_RegCombi1 := '';
- for il_Op2 := 0 to OItem2.Values.Count - 1 do
- begin
- if OItem2.OpActive then
- begin
- sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
- end
- else sl_RegCombi2 := sl_RegCombi1;
- for il_Op3 := 0 to OItem3.Values.Count - 1 do
- begin
- if OItem3.OpActive then
- begin
- sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
- end
- else sl_RegCombi3 := sl_RegCombi2;
- for il_Op4 := 0 to OItem4.Values.Count - 1 do
- begin
- if OItem4.OpActive then
- begin
- sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
- end
- else sl_RegCombi := sl_RegCombi3;
- if sl_RegCombi <> '' then
- begin
- //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
- result.Add(sl_Inst + sl_RegCombi);
- sl_RegCombi := '';
- end;
- end;
- end;
- end;
- end;
- end;
- finally
- FreeAndNil(OItem4);
- end;
- finally
- FreeAndNil(OItem3);
- end;
- finally
- FreeAndNil(OItem2);
- end;
- finally
- FreeAndNil(OItem1);
- end;
- end;
- constructor TAsmTestGenerator.Create;
- begin
- inherited;
- FX64 := true;
- FAVX512 := false;
- FReg8 := TStringList.Create;
- FReg16 := TStringList.Create;
- FReg32Base := TStringList.Create;
- FReg32Index := TStringList.Create;
- FReg64Base := TStringList.Create;
- FReg64Index := TStringList.Create;
- FReg6432Base := TStringList.Create;
- FReg6432Index := TStringList.Create;
- FReg32XMMIndex := TStringList.Create;
- FReg32YMMIndex := TStringList.Create;
- FReg32ZMMIndex := TStringList.Create;
- FReg64XMMIndex := TStringList.Create;
- FReg64YMMIndex := TStringList.Create;
- FReg64ZMMIndex := TStringList.Create;
- FRegKREG := TStringList.Create;
- FReg8.Add('AL');
- FReg8.Add('BL');
- FReg8.Add('CL');
- FReg8.Add('DL');
-
- FReg16.Add('AX');
- FReg16.Add('BX');
- FReg16.Add('CX');
- FReg16.Add('DX');
- FReg32Base.Add('EAX');
- FReg32Base.Add('EBX');
- FReg32Base.Add('ECX');
- FReg32Base.Add('EDX');
- //FReg32Base.Add('ESP');
- //FReg32Base.Add('EBP');
- FReg32Base.Add('EDI');
- FReg32Base.Add('ESI');
- FReg32Index.Add('EAX');
- FReg32Index.Add('EBX');
- FReg32Index.Add('ECX');
- FReg32Index.Add('EDX');
- //FReg32Index.Add('EBP');
- FReg32Index.Add('EDI');
- FReg32Index.Add('ESI');
- FReg64Base.Add('RAX');
- FReg64Base.Add('RBX');
- FReg64Base.Add('RCX');
- FReg64Base.Add('RDX');
- //FReg64Base.Add('RSP');
- //FReg64Base.Add('RBP');
- FReg64Base.Add('RDI');
- FReg64Base.Add('RSI');
- FReg64Base.Add('R8');
- FReg64Base.Add('R9');
- FReg64Base.Add('R10');
- FReg64Base.Add('R11');
- FReg64Base.Add('R12');
- FReg64Base.Add('R13');
- FReg64Base.Add('R14');
- FReg64Base.Add('R15');
- FReg64Index.Add('RAX');
- FReg64Index.Add('RBX');
- FReg64Index.Add('RCX');
- FReg64Index.Add('RDX');
- //FReg64Index.Add('RBP');
- FReg64Index.Add('RDI');
- FReg64Index.Add('RSI');
- FReg64Index.Add('R8');
- FReg64Index.Add('R9');
- FReg64Index.Add('R10');
- FReg64Index.Add('R11');
- FReg64Index.Add('R12');
- FReg64Index.Add('R13');
- FReg64Index.Add('R14');
- FReg64Index.Add('R15');
- FReg6432Base.Add('EAX');
- FReg6432Base.Add('EBX');
- FReg6432Base.Add('ECX');
- FReg6432Base.Add('EDX');
- FReg6432Base.Add('ESP');
- //FReg6432Base.Add('EBP');
- FReg6432Base.Add('EDI');
- FReg6432Base.Add('ESI');
- FReg6432Base.Add('R8D');
- FReg6432Base.Add('R9D');
- FReg6432Base.Add('R10D');
- FReg6432Base.Add('R11D');
- FReg6432Base.Add('R12D');
- FReg6432Base.Add('R13D');
- FReg6432Base.Add('R14D');
- FReg6432Base.Add('R15D');
- FReg6432Index.Add('EAX');
- FReg6432Index.Add('EBX');
- FReg6432Index.Add('ECX');
- FReg6432Index.Add('EDX');
- //FReg6432Index.Add('EBP');
- FReg6432Index.Add('EDI');
- FReg6432Index.Add('ESI');
- FReg6432Index.Add('R8D');
- FReg6432Index.Add('R9D');
- FReg6432Index.Add('R10D');
- FReg6432Index.Add('R11D');
- FReg6432Index.Add('R12D');
- FReg6432Index.Add('R13D');
- FReg6432Index.Add('R14D');
- FReg6432Index.Add('R15D');
- FReg32XMMIndex.ADD('XMM0');
- FReg32XMMIndex.ADD('XMM1');
- FReg32XMMIndex.ADD('XMM2');
- FReg32XMMIndex.ADD('XMM3');
- FReg32XMMIndex.ADD('XMM4');
- FReg32XMMIndex.ADD('XMM5');
- FReg32XMMIndex.ADD('XMM6');
- FReg32XMMIndex.ADD('XMM7');
- FReg32YMMIndex.ADD('YMM0');
- FReg32YMMIndex.ADD('YMM1');
- FReg32YMMIndex.ADD('YMM2');
- FReg32YMMIndex.ADD('YMM3');
- FReg32YMMIndex.ADD('YMM4');
- FReg32YMMIndex.ADD('YMM5');
- FReg32YMMIndex.ADD('YMM6');
- FReg32YMMIndex.ADD('YMM7');
- FReg32ZMMIndex.ADD('ZMM0');
- FReg32ZMMIndex.ADD('ZMM1');
- FReg32ZMMIndex.ADD('ZMM2');
- FReg32ZMMIndex.ADD('ZMM3');
- FReg32ZMMIndex.ADD('ZMM4');
- FReg32ZMMIndex.ADD('ZMM5');
- FReg32ZMMIndex.ADD('ZMM6');
- FReg32ZMMIndex.ADD('ZMM7');
- FReg64XMMIndex.ADD('XMM0');
- FReg64XMMIndex.ADD('XMM1');
- FReg64XMMIndex.ADD('XMM2');
- FReg64XMMIndex.ADD('XMM3');
- FReg64XMMIndex.ADD('XMM4');
- FReg64XMMIndex.ADD('XMM5');
- FReg64XMMIndex.ADD('XMM6');
- FReg64XMMIndex.ADD('XMM7');
- FReg64XMMIndex.ADD('XMM8');
- FReg64XMMIndex.ADD('XMM9');
- FReg64XMMIndex.ADD('XMM10');
- FReg64XMMIndex.ADD('XMM11');
- FReg64XMMIndex.ADD('XMM12');
- FReg64XMMIndex.ADD('XMM13');
- FReg64XMMIndex.ADD('XMM14');
- FReg64XMMIndex.ADD('XMM15');
- FReg64YMMIndex.ADD('YMM0');
- FReg64YMMIndex.ADD('YMM1');
- FReg64YMMIndex.ADD('YMM2');
- FReg64YMMIndex.ADD('YMM3');
- FReg64YMMIndex.ADD('YMM4');
- FReg64YMMIndex.ADD('YMM5');
- FReg64YMMIndex.ADD('YMM6');
- FReg64YMMIndex.ADD('YMM7');
- FReg64YMMIndex.ADD('YMM8');
- FReg64YMMIndex.ADD('YMM9');
- FReg64YMMIndex.ADD('YMM10');
- FReg64YMMIndex.ADD('YMM11');
- FReg64YMMIndex.ADD('YMM12');
- FReg64YMMIndex.ADD('YMM13');
- FReg64YMMIndex.ADD('YMM14');
- FReg64YMMIndex.ADD('YMM15');
- FReg64ZMMIndex.ADD('ZMM0');
- FReg64ZMMIndex.ADD('ZMM1');
- FReg64ZMMIndex.ADD('ZMM2');
- FReg64ZMMIndex.ADD('ZMM3');
- FReg64ZMMIndex.ADD('ZMM4');
- FReg64ZMMIndex.ADD('ZMM5');
- FReg64ZMMIndex.ADD('ZMM6');
- FReg64ZMMIndex.ADD('ZMM7');
- FReg64ZMMIndex.ADD('ZMM8');
- FReg64ZMMIndex.ADD('ZMM9');
- FReg64ZMMIndex.ADD('ZMM10');
- FReg64ZMMIndex.ADD('ZMM11');
- FReg64ZMMIndex.ADD('ZMM12');
- FReg64ZMMIndex.ADD('ZMM13');
- FReg64ZMMIndex.ADD('ZMM14');
- FReg64ZMMIndex.ADD('ZMM15');
- FReg64ZMMIndex.ADD('ZMM16');
- FReg64ZMMIndex.ADD('ZMM17');
- FReg64ZMMIndex.ADD('ZMM18');
- FReg64ZMMIndex.ADD('ZMM19');
- FReg64ZMMIndex.ADD('ZMM20');
- FReg64ZMMIndex.ADD('ZMM21');
- FReg64ZMMIndex.ADD('ZMM22');
- FReg64ZMMIndex.ADD('ZMM23');
- FReg64ZMMIndex.ADD('ZMM24');
- FReg64ZMMIndex.ADD('ZMM25');
- FReg64ZMMIndex.ADD('ZMM26');
- FReg64ZMMIndex.ADD('ZMM27');
- FReg64ZMMIndex.ADD('ZMM28');
- FReg64ZMMIndex.ADD('ZMM29');
- FReg64ZMMIndex.ADD('ZMM30');
- FReg64ZMMIndex.ADD('ZMM31');
- FRegKREG.ADD('K0');
- FRegKREG.ADD('K1');
- FRegKREG.ADD('K2');
- FRegKREG.ADD('K3');
- FRegKREG.ADD('K4');
- FRegKREG.ADD('K5');
- FRegKREG.ADD('K6');
- FRegKREG.ADD('K7');
- end;
- destructor TAsmTestGenerator.Destroy;
- begin
- FreeAndNil(FReg8);
- FreeAndNil(FReg16);
- FreeAndNil(FReg32Base);
- FreeAndNil(FReg32Index);
- FreeAndNil(FReg64Base);
- FreeAndNil(FReg64Index);
- FreeAndNil(FReg6432Base);
- FreeAndNil(FReg6432Index);
- FreeAndNil(FReg32XMMIndex);
- FreeAndNil(FReg32YMMIndex);
- FreeAndNil(FReg32ZMMIndex);
- FreeAndNil(FReg64XMMIndex);
- FreeAndNil(FReg64YMMIndex);
- FreeAndNil(FReg64ZMMIndex);
- FreeAndnil(FRegKREG);
- inherited;
- end;
- procedure TAsmTestGenerator.MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg,
- aSLIndexReg, aRList: TStringList);
- var
- il_Base: integer;
- il_Index: integer;
- begin
- for il_Base := 0 to aSLBaseReg.Count - 1 do
- begin
- aRList.Add(format(aPrefix + '[%s]%s', [aSLBaseReg[il_Base], aSuffix]));
- for il_Index := 0 to aSLIndexReg.Count - 1 do
- begin
- aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s + $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s + $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s - $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s - $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 8 + 64]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- end;
- end;
- end;
- procedure TAsmTestGenerator.VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String;
- aSLBaseReg, aSLIndexReg, aRList: TStringList);
- var
- il_Base: integer;
- il_Index: integer;
- begin
- //for il_Index := 0 to aSLIndexReg.Count - 1 do
- //begin
- // aRList.Add(format(aPrefix + '[%s]', [aSLIndexReg[il_Index]]));
- //
- // aRList.Add(format(aPrefix + '[%s * 2]', [aSLIndexReg[il_Index]]));
- // aRList.Add(format(aPrefix + '[%s * 4]', [aSLIndexReg[il_Index]]));
- // aRList.Add(format(aPrefix + '[%s * 8]', [aSLIndexReg[il_Index]]));
- //
- // aRList.Add(format(aPrefix + '[%s * 2 + 16]', [aSLIndexReg[il_Index]]));
- // aRList.Add(format(aPrefix + '[%s * 4 + 32]', [aSLIndexReg[il_Index]]));
- // aRList.Add(format(aPrefix + '[%s * 8 + 48]', [aSLIndexReg[il_Index]]));
- //end;
- for il_Base := 0 to aSLBaseReg.Count - 1 do
- begin
- //aRList.Add(format(aPrefix + '[%s]', [aSLBaseReg[il_Base]]));
- for il_Index := 0 to aSLIndexReg.Count - 1 do
- begin
- aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
- //aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
- //aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
- //aRList.Add(format(aPrefix + '[%s + %s * 8 + 48]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
- aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLIndexReg[il_Index], aSLBaseReg[il_Base], aSuffix]));
- //aRList.Add(format(aPrefix + '[%s + %s + 16]', [aSLIndexReg[il_Index], aSLBaseReg[il_Base]]));
- end;
- end;
- end;
- class procedure TAsmTestGenerator.CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
- aOp4: String; aSL: TStringList);
- var
- sl: TStringList;
- begin
- with TAsmTestGenerator.Create do
- try
- Fx64 := aX64;
- FAVX512 := aAVX512;
- FSAE := aSAE;
- sl := InternalCalcTestData(aInst, aOp1, aOp2, aOp3, aOp4);
- try
- aSL.AddStrings(sl);
- finally
- FreeAndNil(sl);
- end;
- finally
- Free;
- end;
- end;
- class procedure TAsmTestGenerator.CalcTestInstFile;
- var
- i,j: integer;
- sInst: string;
- sI386: string;
- sX8664: string;
- sAVX512: string;
- sOperands: string;
- sLine: string;
- sl: TStringList;
- bVEX: boolean;
- bEVEX: boolean;
- b256 : boolean;
- b512 : boolean;
- begin
- sl := TStringList.Create;
- try
- //tinsentry=packed record
- // opcode : tasmop;
- // ops : byte;
- // //optypes : array[0..max_operands-1] of longint;
- // optypes : array[0..3] of int64; //TG
- // code : array[0..11] of char;
- // flags : tinsflags;
- //end;
- for i := 0 to length(InsTab) - 1 do
- begin
- bVEX := false;
- bEVEX := false;
- b256 := false;
- b512 := false;
- //TG TODO delete
- if instab[i].opcode = a_vtestps then
- begin
- b512 := b512;
- end;
- for j := 0 to length(InsTab[i].code) - 1 do
- begin
- case ord(InsTab[i].code[j]) of
- 0: break;
- 1,2,3: break;
- 232: bEVEX := true;
- 233: b512 := true;
- 242: bVEX := true;
- 244: b256 := true;
- end;
- end;
- if bVEX or bEVEX then
- begin
- sInst := std_op2str[InsTab[i].opcode];
- sI386 := '1';
- sX8664 := '1';
- if IF_X86_64 in InsTab[i].flags then
- begin
- sI386 := '0';
- end;
- if bEVEX then sAVX512 := '1'
- else sAVX512 := '0';
- sOperands := '';
- for j := 0 to 3 do
- begin
- case InsTab[i].optypes[j] of
- OT_XMMREG: sOperands := sOperands + 'XMMREG,';
- OT_XMMREG_M: sOperands := sOperands + 'XMMREG_M,';
- OT_XMMREG_MZ: sOperands := sOperands + 'XMMREG_MZ,';
- OT_XMMREG_ER: sOperands := sOperands + 'XMMREG_ER,';
- OT_XMMREG_SAE: sOperands := sOperands + 'XMMREG_SAE,';
- OT_XMMRM: sOperands := sOperands + 'XMMRM,';
- OT_XMMRM_MZ: sOperands := sOperands + 'XMMRM_MZ,';
- OT_YMMREG: sOperands := sOperands + 'YMMREG,';
- OT_YMMREG_M: sOperands := sOperands + 'YMMREG_M,';
- OT_YMMREG_MZ: sOperands := sOperands + 'YMMREG_MZ,';
- OT_YMMREG_ER: sOperands := sOperands + 'YMMREG_ER,';
- OT_YMMREG_SAE: sOperands := sOperands + 'YMMREG_SAE,';
- OT_YMMRM: sOperands := sOperands + 'YMMRM,';
- OT_YMMRM_MZ: sOperands := sOperands + 'YMMRM_MZ,';
- OT_ZMMREG: sOperands := sOperands + 'ZMMREG,';
- OT_ZMMREG_M: sOperands := sOperands + 'ZMMREG_M,';
- OT_ZMMREG_MZ: sOperands := sOperands + 'ZMMREG_MZ,';
- OT_ZMMREG_ER: sOperands := sOperands + 'ZMMREG_ER,';
- OT_ZMMREG_SAE: sOperands := sOperands + 'ZMMREG_SAE,';
- OT_ZMMRM: sOperands := sOperands + 'ZMMRM,';
- OT_ZMMRM_MZ: sOperands := sOperands + 'ZMMRM_MZ,';
- OT_MEM32: sOperands := sOperands + 'MEM32,';
- OT_MEM64: sOperands := sOperands + 'MEM64,';
- OT_MEM128: sOperands := sOperands + 'MEM128,';
- OT_MEM256: sOperands := sOperands + 'MEM256,';
- OT_MEM512: sOperands := sOperands + 'MEM512,';
- OT_REG32: sOperands := sOperands + 'REG32,';
- OT_REG64: sOperands := sOperands + 'REG64,';
- ot_rm_gpr or ot_bits32:
- sOperands := sOperands + 'RM32,';
- ot_rm_gpr or ot_bits64:
- sOperands := sOperands + 'RM64,';
- OT_XMEM32: sOperands := sOperands + 'XMEM32,';
- OT_XMEM64: sOperands := sOperands + 'XMEM64,';
- OT_YMEM32: sOperands := sOperands + 'YMEM32,';
- OT_YMEM64: sOperands := sOperands + 'YMEM64,';
- OT_IMM8: sOperands := sOperands + 'IMM8,';
- OT_NONE: sOperands := sOperands + ',';
- OT_BMEM32: if b512 then sOperands := sOperands + '16B32,'
- else if b256 then sOperands := sOperands + '8B32,'
- else sOperands := sOperands + '4B32,';
- OT_BMEM64: if b512 then sOperands := sOperands + '8B32,'
- else if b256 then sOperands := sOperands + '4B32,'
- else sOperands := sOperands + '2B64,';
- OT_KREG: sOperands := sOperands + 'KREG,';
- OT_KREG_M: sOperands := sOperands + 'KREG_M,';
- else sOperands := sOperands;
- end;
- end;
- sOperands := copy(sOperands, 1, length(sOperands) - 1);
- sl.Add(format('FOpCodeList.Add(''%s,%s,%s,%s,%s'');', [sInst, sI386, sX8664, sAVX512, sOperands]));
- end;
- end;
- sl.Savetofile('/tmp/fpcavx512.txt');
- // std_op2str
- finally
- FreeAndnil(sl);
- end;
- end;
- end.
|