asmtestgenerator.pas 83 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361
  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. public
  71. constructor Create;
  72. destructor Destroy; override;
  73. class procedure CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  74. class procedure CalcTestInstFile;
  75. property x64: boolean read Fx64;
  76. end;
  77. implementation
  78. uses SysUtils, Dialogs;
  79. const
  80. instabentries = {$i ../../../compiler/x86_64/x8664nop.inc}
  81. type
  82. TAsmOp={$i ../../../compiler/x86_64/x8664op.inc}
  83. op2strtable=array[tasmop] of string[16];
  84. {Instruction flags }
  85. tinsflag = (
  86. { please keep these in order and in sync with IF_SMASK }
  87. IF_SM, { size match first two operands }
  88. IF_SM2,
  89. IF_SB, { unsized operands can't be non-byte }
  90. IF_SW, { unsized operands can't be non-word }
  91. IF_SD, { unsized operands can't be nondword }
  92. { unsized argument spec }
  93. { please keep these in order and in sync with IF_ARMASK }
  94. IF_AR0, { SB, SW, SD applies to argument 0 }
  95. IF_AR1, { SB, SW, SD applies to argument 1 }
  96. IF_AR2, { SB, SW, SD applies to argument 2 }
  97. IF_PRIV, { it's a privileged instruction }
  98. IF_SMM, { it's only valid in SMM }
  99. IF_PROT, { it's protected mode only }
  100. IF_NOX86_64, { removed instruction in x86_64 }
  101. IF_UNDOC, { it's an undocumented instruction }
  102. IF_FPU, { it's an FPU instruction }
  103. IF_MMX, { it's an MMX instruction }
  104. { it's a 3DNow! instruction }
  105. IF_3DNOW,
  106. { it's a SSE (KNI, MMX2) instruction }
  107. IF_SSE,
  108. { SSE2 instructions }
  109. IF_SSE2,
  110. { SSE3 instructions }
  111. IF_SSE3,
  112. { SSE64 instructions }
  113. IF_SSE64,
  114. { SVM instructions }
  115. IF_SVM,
  116. { SSE4 instructions }
  117. IF_SSE4,
  118. IF_SSSE3,
  119. IF_SSE41,
  120. IF_SSE42,
  121. IF_MOVBE,
  122. IF_CLMUL,
  123. IF_AVX,
  124. IF_AVX2,
  125. IF_AVX512,
  126. IF_BMI1,
  127. IF_BMI2,
  128. { Intel ADX (Multi-Precision Add-Carry Instruction Extensions) }
  129. IF_ADX,
  130. IF_16BITONLY,
  131. IF_FMA,
  132. IF_FMA4,
  133. IF_TSX,
  134. IF_RAND,
  135. IF_XSAVE,
  136. IF_PREFETCHWT1,
  137. { mask for processor level }
  138. { please keep these in order and in sync with IF_PLEVEL }
  139. IF_8086, { 8086 instruction }
  140. IF_186, { 186+ instruction }
  141. IF_286, { 286+ instruction }
  142. IF_386, { 386+ instruction }
  143. IF_486, { 486+ instruction }
  144. IF_PENT, { Pentium instruction }
  145. IF_P6, { P6 instruction }
  146. IF_KATMAI, { Katmai instructions }
  147. IF_WILLAMETTE, { Willamette instructions }
  148. IF_PRESCOTT, { Prescott instructions }
  149. IF_X86_64,
  150. IF_SANDYBRIDGE, { Sandybridge-specific instruction }
  151. IF_NEC, { NEC V20/V30 instruction }
  152. { the following are not strictly part of the processor level, because
  153. they are never used standalone, but always in combination with a
  154. separate processor level flag. Therefore, they use bits outside of
  155. IF_PLEVEL, otherwise they would mess up the processor level they're
  156. used in combination with.
  157. The following combinations are currently used:
  158. [IF_AMD, IF_P6],
  159. [IF_CYRIX, IF_486],
  160. [IF_CYRIX, IF_PENT],
  161. [IF_CYRIX, IF_P6] }
  162. IF_CYRIX, { Cyrix, Centaur or VIA-specific instruction }
  163. IF_AMD, { AMD-specific instruction }
  164. { added flags }
  165. IF_PRE, { it's a prefix instruction }
  166. IF_PASS2, { if the instruction can change in a second pass }
  167. IF_IMM4, { immediate operand is a nibble (must be in range [0..15]) }
  168. IF_IMM3, { immediate operand is a triad (must be in range [0..7]) }
  169. IF_BCST2,
  170. IF_BCST4,
  171. IF_BCST8,
  172. IF_BCST16,
  173. IF_T2, { disp8 - tuple - 2 }
  174. IF_T4, { disp8 - tuple - 4 }
  175. IF_T8, { disp8 - tuple - 8 }
  176. IF_T1S, { disp8 - tuple - 1 scalar }
  177. IF_T1S8,
  178. IF_T1S16,
  179. IF_T1F32,
  180. IF_T1F64,
  181. IF_TMDDUP,
  182. IF_TFV, { disp8 - tuple - full vector }
  183. IF_TFVM, { disp8 - tuple - full vector memory }
  184. IF_TQVM,
  185. IF_TMEM128,
  186. IF_THV,
  187. IF_THVM,
  188. IF_TOVM,
  189. IF_SCL32,
  190. IF_SCL64
  191. );
  192. tinsflags=set of tinsflag;
  193. tinsentry=packed record
  194. opcode : tasmop;
  195. ops : byte;
  196. //optypes : array[0..max_operands-1] of longint;
  197. optypes : array[0..3] of int64; //TG
  198. code : array[0..11] of char;
  199. flags : tinsflags;
  200. end;
  201. pinsentry=^tinsentry;
  202. const
  203. OT_NONE = $00000000;
  204. { Bits 0..7: sizes }
  205. OT_BITS8 = $00000001;
  206. OT_BITS16 = $00000002;
  207. OT_BITS32 = $00000004;
  208. OT_BITS64 = $00000008; { x86_64 and FPU }
  209. //OT_BITS128 = $10000000; { 16 byte SSE }
  210. //OT_BITS256 = $20000000; { 32 byte AVX }
  211. //OT_BITS512 = $40000000; { 64 byte AVX512 }
  212. OT_BITS128 = $20000000; { 16 byte SSE }
  213. OT_BITS256 = $40000000; { 32 byte AVX }
  214. OT_BITS512 = $80000000; { 64 byte AVX512 }
  215. OT_VECTORMASK = $1000000000; { OPTIONAL VECTORMASK AVX512}
  216. OT_VECTORZERO = $2000000000; { OPTIONAL ZERO-FLAG AVX512}
  217. OT_VECTORBCST = $4000000000; { BROADCAST-MEM-FLAG AVX512}
  218. OT_VECTORSAE = $8000000000; { OPTIONAL SAE-FLAG AVX512}
  219. OT_VECTORER = $10000000000; { OPTIONAL ER-FLAG-FLAG AVX512}
  220. OT_BITSB32 = OT_BITS32 or OT_VECTORBCST;
  221. OT_BITSB64 = OT_BITS64 or OT_VECTORBCST;
  222. OT_VECTOR_EXT_MASK = OT_VECTORMASK or OT_VECTORZERO or OT_VECTORBCST;
  223. OT_BITS80 = $00000010; { FPU only }
  224. OT_FAR = $00000020; { this means 16:16 or 16:32, like in CALL/JMP }
  225. OT_NEAR = $00000040;
  226. OT_SHORT = $00000080;
  227. { TODO: FAR/NEAR/SHORT are sizes too, they should be included into size mask,
  228. but this requires adjusting the opcode table }
  229. //OT_SIZE_MASK = $3000001F; { all the size attributes }
  230. OT_SIZE_MASK = $E000001F; { all the size attributes }
  231. OT_NON_SIZE = int64(not int64(OT_SIZE_MASK));
  232. { Bits 8..11: modifiers }
  233. OT_SIGNED = $00000100; { the operand need to be signed -128-127 }
  234. OT_TO = $00000200; { reverse effect in FADD, FSUB &c }
  235. OT_COLON = $00000400; { operand is followed by a colon }
  236. OT_MODIFIER_MASK = $00000F00;
  237. { Bits 12..15: type of operand }
  238. OT_REGISTER = $00001000;
  239. OT_IMMEDIATE = $00002000;
  240. OT_MEMORY = $0000C000; { always includes 'OT_REGMEM' bit as well }
  241. OT_REGMEM = $00008000; { for r/m, ie EA, operands }
  242. OT_TYPE_MASK = OT_REGISTER or OT_IMMEDIATE or OT_MEMORY or OT_REGMEM;
  243. OT_REGNORM = OT_REGISTER or OT_REGMEM; { 'normal' reg, qualifies as EA }
  244. { Bits 20..22, 24..26: register classes
  245. otf_* consts are not used alone, only to build other constants. }
  246. otf_reg_cdt = $00100000;
  247. otf_reg_gpr = $00200000;
  248. otf_reg_sreg = $00400000;
  249. otf_reg_k = $00800000;
  250. otf_reg_fpu = $01000000;
  251. otf_reg_mmx = $02000000;
  252. otf_reg_xmm = $04000000;
  253. otf_reg_ymm = $08000000;
  254. otf_reg_zmm = $10000000;
  255. otf_reg_extra_mask = $0F000000;
  256. { Bits 16..19: subclasses, meaning depends on classes field }
  257. otf_sub0 = $00010000;
  258. otf_sub1 = $00020000;
  259. otf_sub2 = $00040000;
  260. otf_sub3 = $00080000;
  261. OT_REG_SMASK = otf_sub0 or otf_sub1 or otf_sub2 or otf_sub3;
  262. //OT_REG_EXTRA_MASK = $0F000000;
  263. OT_REG_EXTRA_MASK = $1F000000;
  264. OT_REG_TYPMASK = otf_reg_cdt or otf_reg_gpr or otf_reg_sreg or otf_reg_k or otf_reg_extra_mask;
  265. { register class 0: CRx, DRx and TRx }
  266. OT_REG_CDT = OT_REGISTER or otf_reg_cdt or OT_BITS64;
  267. OT_REG_CREG = OT_REG_CDT or otf_sub0; { CRn }
  268. OT_REG_DREG = OT_REG_CDT or otf_sub1; { DRn }
  269. OT_REG_TREG = OT_REG_CDT or otf_sub2; { TRn }
  270. OT_REG_CR4 = OT_REG_CDT or otf_sub3; { CR4 (Pentium only) }
  271. { register class 1: general-purpose registers }
  272. OT_REG_GPR = OT_REGNORM or otf_reg_gpr;
  273. OT_RM_GPR = OT_REGMEM or otf_reg_gpr;
  274. OT_REG8 = OT_REG_GPR or OT_BITS8; { 8-bit GPR }
  275. OT_REG16 = OT_REG_GPR or OT_BITS16;
  276. OT_REG32 = OT_REG_GPR or OT_BITS32;
  277. OT_REG64 = OT_REG_GPR or OT_BITS64;
  278. { GPR subclass 0: accumulator: AL, AX, EAX or RAX }
  279. OT_REG_ACCUM = OT_REG_GPR or otf_sub0;
  280. OT_REG_AL = OT_REG_ACCUM or OT_BITS8;
  281. OT_REG_AX = OT_REG_ACCUM or OT_BITS16;
  282. OT_REG_EAX = OT_REG_ACCUM or OT_BITS32;
  283. OT_REG_RAX = OT_REG_ACCUM or OT_BITS64;
  284. { GPR subclass 1: counter: CL, CX, ECX or RCX }
  285. OT_REG_COUNT = OT_REG_GPR or otf_sub1;
  286. OT_REG_CL = OT_REG_COUNT or OT_BITS8;
  287. OT_REG_CX = OT_REG_COUNT or OT_BITS16;
  288. OT_REG_ECX = OT_REG_COUNT or OT_BITS32;
  289. OT_REG_RCX = OT_REG_COUNT or OT_BITS64;
  290. { GPR subclass 2: data register: DL, DX, EDX or RDX }
  291. OT_REG_DX = OT_REG_GPR or otf_sub2 or OT_BITS16;
  292. OT_REG_EDX = OT_REG_GPR or otf_sub2 or OT_BITS32;
  293. { register class 2: Segment registers }
  294. OT_REG_SREG = OT_REGISTER or otf_reg_sreg or OT_BITS16;
  295. OT_REG_CS = OT_REG_SREG or otf_sub0; { CS }
  296. OT_REG_DESS = OT_REG_SREG or otf_sub1; { DS, ES, SS (non-CS 86 registers) }
  297. OT_REG_FSGS = OT_REG_SREG or otf_sub2; { FS, GS (386 extended registers) }
  298. { register class 3: FPU registers }
  299. OT_FPUREG = OT_REGISTER or otf_reg_fpu;
  300. OT_FPU0 = OT_FPUREG or otf_sub0; { FPU stack register zero }
  301. { register class 4: MMX (both reg and r/m) }
  302. OT_MMXREG = OT_REGNORM or otf_reg_mmx;
  303. OT_MMXRM = OT_REGMEM or otf_reg_mmx;
  304. { register class 5: XMM (both reg and r/m) }
  305. OT_XMMREG = OT_REGNORM or otf_reg_xmm;
  306. OT_XMMRM = OT_REGMEM or otf_reg_xmm;
  307. OT_XMEM32 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS32;
  308. OT_XMEM32_M = OT_XMEM32 or OT_VECTORMASK;
  309. OT_XMEM64 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS64;
  310. OT_XMEM64_M = OT_XMEM64 or OT_VECTORMASK;
  311. OT_XMMREG_M = OT_XMMREG or OT_VECTORMASK;
  312. OT_XMMREG_MZ = OT_XMMREG or OT_VECTORMASK or OT_VECTORZERO;
  313. OT_XMMRM_MZ = OT_XMMRM or OT_VECTORMASK or OT_VECTORZERO;
  314. OT_XMMREG_SAE = OT_XMMREG or OT_VECTORSAE;
  315. OT_XMMRM_SAE = OT_XMMRM or OT_VECTORSAE;
  316. OT_XMMREG_ER = OT_XMMREG or OT_VECTORER;
  317. OT_XMMRM_ER = OT_XMMRM or OT_VECTORER;
  318. { register class 5: YMM (both reg and r/m) }
  319. OT_YMMREG = OT_REGNORM or otf_reg_ymm;
  320. OT_YMMRM = OT_REGMEM or otf_reg_ymm;
  321. OT_YMEM32 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS32;
  322. OT_YMEM32_M = OT_YMEM32 or OT_VECTORMASK;
  323. OT_YMEM64 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS64;
  324. OT_YMEM64_M = OT_YMEM64 or OT_VECTORMASK;
  325. OT_YMMREG_M = OT_YMMREG or OT_VECTORMASK;
  326. OT_YMMREG_MZ = OT_YMMREG or OT_VECTORMASK or OT_VECTORZERO;
  327. OT_YMMRM_MZ = OT_YMMRM or OT_VECTORMASK or OT_VECTORZERO;
  328. OT_YMMREG_SAE = OT_YMMREG or OT_VECTORSAE;
  329. OT_YMMRM_SAE = OT_YMMRM or OT_VECTORSAE;
  330. OT_YMMREG_ER = OT_YMMREG or OT_VECTORER;
  331. OT_YMMRM_ER = OT_YMMRM or OT_VECTORER;
  332. { register class 5: ZMM (both reg and r/m) }
  333. OT_ZMMREG = OT_REGNORM or otf_reg_zmm;
  334. OT_ZMMRM = OT_REGMEM or otf_reg_zmm;
  335. OT_ZMEM32 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS32;
  336. OT_ZMEM32_M = OT_ZMEM32 or OT_VECTORMASK;
  337. OT_ZMEM64 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS64;
  338. OT_ZMEM64_M = OT_ZMEM64 or OT_VECTORMASK;
  339. OT_ZMMREG_M = OT_ZMMREG or OT_VECTORMASK;
  340. OT_ZMMREG_MZ = OT_ZMMREG or OT_VECTORMASK or OT_VECTORZERO;
  341. OT_ZMMRM_MZ = OT_ZMMRM or OT_VECTORMASK or OT_VECTORZERO;
  342. OT_ZMMREG_SAE = OT_ZMMREG or OT_VECTORSAE;
  343. OT_ZMMRM_SAE = OT_ZMMRM or OT_VECTORSAE;
  344. OT_ZMMREG_ER = OT_ZMMREG or OT_VECTORER;
  345. OT_ZMMRM_ER = OT_ZMMRM or OT_VECTORER;
  346. OT_KREG = OT_REGNORM or otf_reg_k;
  347. OT_KREG_M = OT_KREG or OT_VECTORMASK;
  348. { Vector-Memory operands }
  349. OT_VMEM_ANY = OT_XMEM32 or OT_XMEM64 or OT_YMEM32 or OT_YMEM64 or OT_ZMEM32 or OT_ZMEM64;
  350. { Memory operands }
  351. OT_MEM8 = OT_MEMORY or OT_BITS8;
  352. OT_MEM16 = OT_MEMORY or OT_BITS16;
  353. OT_MEM16_M = OT_MEM16 or OT_VECTORMASK;
  354. OT_MEM32 = OT_MEMORY or OT_BITS32;
  355. OT_MEM32_M = OT_MEMORY or OT_BITS32 or OT_VECTORMASK;
  356. OT_BMEM32 = OT_MEMORY or OT_BITS32 or OT_VECTORBCST;
  357. OT_BMEM32_SAE= OT_MEMORY or OT_BITS32 or OT_VECTORBCST or OT_VECTORSAE;
  358. OT_MEM64 = OT_MEMORY or OT_BITS64;
  359. OT_MEM64_M = OT_MEMORY or OT_BITS64 or OT_VECTORMASK;
  360. OT_BMEM64 = OT_MEMORY or OT_BITS64 or OT_VECTORBCST;
  361. OT_BMEM64_SAE= OT_MEMORY or OT_BITS64 or OT_VECTORBCST or OT_VECTORSAE;
  362. OT_MEM128 = OT_MEMORY or OT_BITS128;
  363. OT_MEM128_M = OT_MEMORY or OT_BITS128 or OT_VECTORMASK;
  364. OT_MEM256 = OT_MEMORY or OT_BITS256;
  365. OT_MEM256_M = OT_MEMORY or OT_BITS256 or OT_VECTORMASK;
  366. OT_MEM512 = OT_MEMORY or OT_BITS512;
  367. OT_MEM512_M = OT_MEMORY or OT_BITS512 or OT_VECTORMASK;
  368. OT_MEM80 = OT_MEMORY or OT_BITS80;
  369. OT_MEM_OFFS = OT_MEMORY or otf_sub0; { special type of EA }
  370. { simple [address] offset }
  371. { Matches any type of r/m operand }
  372. 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;
  373. { Immediate operands }
  374. OT_IMM8 = OT_IMMEDIATE or OT_BITS8;
  375. OT_IMM16 = OT_IMMEDIATE or OT_BITS16;
  376. OT_IMM32 = OT_IMMEDIATE or OT_BITS32;
  377. OT_IMM64 = OT_IMMEDIATE or OT_BITS64;
  378. OT_ONENESS = otf_sub0; { special type of immediate operand }
  379. OT_UNITY = OT_IMMEDIATE or OT_ONENESS; { for shift/rotate instructions }
  380. std_op2str:op2strtable={$i ../../../compiler/x86_64/x8664int.inc}
  381. InsTab:array[0..instabentries-1] of TInsEntry={$i ../../../compiler/x86_64/x8664tab.inc}
  382. { TOperandListItem }
  383. constructor TOperandListItem.Create;
  384. begin
  385. inherited;
  386. FOpActive := false;
  387. FOpNumber := -1;
  388. FOpTyp := otUnknown;
  389. FValues := TStringList.Create;
  390. end;
  391. destructor TOperandListItem.Destroy;
  392. begin
  393. FreeAndNil(FValues);
  394. inherited;
  395. end;
  396. { TOperandList }
  397. function TOperandList.Add(aItem: TOperandListItem): integer;
  398. begin
  399. result := FList.Add(aItem);
  400. end;
  401. function TOperandList.GetItems(aIndex: integer): TOperandListItem;
  402. begin
  403. result := TOperandListItem(FList[aIndex]);
  404. end;
  405. { TAsmTestGenerator }
  406. function TAsmTestGenerator.InternalCalcTestData(const aInst, aOp1, aOp2, aOp3,
  407. aOp4: String): TStringList;
  408. var
  409. i: integer;
  410. Item: TOperandListItem;
  411. OItem1: TOperandListItem;
  412. OItem2: TOperandListItem;
  413. OItem3: TOperandListItem;
  414. OItem4: TOperandListItem;
  415. il_Op: integer;
  416. il_Op1: integer;
  417. il_Op2: integer;
  418. il_Op3: integer;
  419. il_Op4: integer;
  420. sSuffix: string;
  421. sl_Operand: String;
  422. sl_Inst : String;
  423. sl_RegCombi: String;
  424. sl_Prefix: String;
  425. UsePrefix: boolean;
  426. il_Operands: integer;
  427. UsedParams: cardinal;
  428. UseDefault: boolean;
  429. sl_RegCombi1: string;
  430. sl_RegCombi2: string;
  431. sl_RegCombi3: string;
  432. function PrepareOperandTyp(const aTyp: String): String;
  433. begin
  434. result := aTyp;
  435. if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
  436. if result = 'XMMRM128' then result := 'XMMRM';
  437. if result = 'YMMRM256' then result := 'YMMRM';
  438. end;
  439. begin
  440. result := TStringList.Create;
  441. OItem1 := TOperandListItem.Create;
  442. try
  443. OItem2 := TOperandListItem.Create;
  444. try
  445. OItem3 := TOperandListItem.Create;
  446. try
  447. OItem4 := TOperandListItem.Create;
  448. try
  449. UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
  450. (UpperCase(aInst) = 'VCVTPD2PS') OR
  451. (UpperCase(aInst) = 'VCVTSI2SD') OR
  452. (UpperCase(aInst) = 'VCVTSI2SS') OR
  453. (UpperCase(aInst) = 'VCVTTPD2DQ') or
  454. (UpperCase(aInst) = 'VPMOVZXWQ') or
  455. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  456. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  457. (UpperCase(aInst) = 'VCVTTPD2UDQ') or
  458. (UpperCase(aInst) = 'VCVTUQQ2PS') or
  459. (UpperCase(aInst) = 'VCVTQQ2PS') or
  460. (UpperCase(aInst) = 'VCVTUSI2SD') or
  461. (UpperCase(aInst) = 'VCVTUSI2SS') or
  462. (UpperCase(aInst) = 'VFPCLASSPD') or
  463. (UpperCase(aInst) = 'VFPCLASSPS') or
  464. (UpperCase(aInst) = 'VCMPSS')
  465. ;
  466. for il_Op := 1 to 4 do
  467. begin
  468. sl_Prefix := '';
  469. case il_Op of
  470. 1: begin
  471. Item := OItem1;
  472. sl_Operand := aOp1;
  473. end;
  474. 2: begin
  475. Item := OItem2;
  476. sl_Operand := aOp2;
  477. end;
  478. 3: begin
  479. Item := OItem3;
  480. sl_Operand := aOp3;
  481. end;
  482. 4: begin
  483. Item := OItem4;
  484. sl_Operand := aOp4;
  485. end;
  486. end;
  487. sl_Operand := PrepareOperandTyp(sl_Operand);
  488. if (AnsiSameText(sl_Operand, 'XMMREG')) or
  489. (AnsiSameText(sl_Operand, 'XMMREG_M')) or
  490. (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
  491. (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
  492. (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
  493. begin
  494. Item.OpNumber := il_Op;
  495. Item.OpTyp := otXMMReg;
  496. Item.OpActive := true;
  497. sSuffix := '';
  498. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  499. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  500. if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
  501. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  502. Item.Values.Add('XMM0' + sSuffix);
  503. Item.Values.Add('XMM1' + sSuffix);
  504. Item.Values.Add('XMM2' + sSuffix);
  505. Item.Values.Add('XMM3' + sSuffix);
  506. Item.Values.Add('XMM4' + sSuffix);
  507. Item.Values.Add('XMM5' + sSuffix);
  508. Item.Values.Add('XMM6' + sSuffix);
  509. Item.Values.Add('XMM7' + sSuffix);
  510. if x64 then
  511. begin
  512. Item.Values.Clear;
  513. if FAVX512 then
  514. begin
  515. Item.Values.Add('XMM0' + sSuffix);
  516. Item.Values.Add('XMM9' + sSuffix);
  517. Item.Values.Add('XMM18' + sSuffix);
  518. Item.Values.Add('XMM27' + sSuffix);
  519. Item.Values.Add('XMM31' + sSuffix);
  520. if sSuffix <> '' then
  521. begin
  522. Item.Values.Add('XMM0');
  523. Item.Values.Add('XMM9');
  524. Item.Values.Add('XMM18');
  525. Item.Values.Add('XMM27');
  526. Item.Values.Add('XMM31');
  527. end;
  528. end
  529. else
  530. begin
  531. Item.Values.Add('XMM0' + sSuffix);
  532. Item.Values.Add('XMM4' + sSuffix);
  533. Item.Values.Add('XMM8' + sSuffix);
  534. Item.Values.Add('XMM12' + sSuffix);
  535. Item.Values.Add('XMM15' + sSuffix);
  536. if sSuffix <> '' then
  537. begin
  538. Item.Values.Add('XMM0');
  539. Item.Values.Add('XMM4');
  540. Item.Values.Add('XMM8');
  541. Item.Values.Add('XMM12');
  542. Item.Values.Add('XMM15');
  543. end;
  544. end;
  545. end;
  546. end
  547. else if (AnsiSameText(sl_Operand, 'XMMRM')) or
  548. (AnsiSameText(sl_Operand, 'XMMRM_M')) or
  549. (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
  550. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  551. (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
  552. begin
  553. Item.OpNumber := il_Op;
  554. Item.OpTyp := otXMMRM;
  555. Item.OpActive := true;
  556. if UsePrefix then sl_Prefix := 'oword ';
  557. sSuffix := '';
  558. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  559. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  560. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  561. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  562. Item.Values.Add('XMM0' + sSuffix);
  563. Item.Values.Add('XMM1' + sSuffix);
  564. Item.Values.Add('XMM2' + sSuffix);
  565. Item.Values.Add('XMM3' + sSuffix);
  566. Item.Values.Add('XMM4' + sSuffix);
  567. Item.Values.Add('XMM5' + sSuffix);
  568. Item.Values.Add('XMM6' + sSuffix);
  569. Item.Values.Add('XMM7' + sSuffix);
  570. if x64 then
  571. begin
  572. Item.Values.Clear;
  573. if FAVX512 then
  574. begin
  575. Item.Values.Add('XMM0' + sSuffix);
  576. Item.Values.Add('XMM0');
  577. Item.Values.Add('XMM9' + sSuffix);
  578. Item.Values.Add('XMM9');
  579. Item.Values.Add('XMM18' + sSuffix);
  580. Item.Values.Add('XMM18');
  581. Item.Values.Add('XMM27' + sSuffix);
  582. Item.Values.Add('XMM27');
  583. Item.Values.Add('XMM31' + sSuffix);
  584. Item.Values.Add('XMM31');
  585. end
  586. else
  587. begin
  588. Item.Values.Add('XMM0' + sSuffix);
  589. Item.Values.Add('XMM0');
  590. Item.Values.Add('XMM4' + sSuffix);
  591. Item.Values.Add('XMM4');
  592. Item.Values.Add('XMM8' + sSuffix);
  593. Item.Values.Add('XMM8');
  594. Item.Values.Add('XMM12' + sSuffix);
  595. Item.Values.Add('XMM15');
  596. Item.Values.Add('XMM15' + sSuffix);
  597. end;
  598. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  599. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  600. end
  601. else
  602. begin
  603. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  604. end;
  605. end
  606. else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
  607. (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
  608. (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
  609. (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
  610. (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
  611. begin
  612. Item.OpNumber := il_Op;
  613. Item.OpTyp := otXMMRM8;
  614. Item.OpActive := true;
  615. if UsePrefix then sl_Prefix := 'byte ';
  616. sSuffix := '';
  617. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  618. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  619. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  620. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  621. Item.Values.Add('XMM0' + sSuffix);
  622. Item.Values.Add('XMM1' + sSuffix);
  623. Item.Values.Add('XMM2' + sSuffix);
  624. Item.Values.Add('XMM3' + sSuffix);
  625. Item.Values.Add('XMM4' + sSuffix);
  626. Item.Values.Add('XMM5' + sSuffix);
  627. Item.Values.Add('XMM6' + sSuffix);
  628. Item.Values.Add('XMM7' + sSuffix);
  629. if x64 then
  630. begin
  631. Item.Values.Clear;
  632. if FAVX512 then
  633. begin
  634. Item.Values.Add('XMM0' + sSuffix);
  635. Item.Values.Add('XMM0');
  636. Item.Values.Add('XMM9' + sSuffix);
  637. Item.Values.Add('XMM9');
  638. Item.Values.Add('XMM18' + sSuffix);
  639. Item.Values.Add('XMM18');
  640. Item.Values.Add('XMM27' + sSuffix);
  641. Item.Values.Add('XMM27');
  642. Item.Values.Add('XMM31' + sSuffix);
  643. Item.Values.Add('XMM31');
  644. end
  645. else
  646. begin
  647. Item.Values.Add('XMM0' + sSuffix);
  648. Item.Values.Add('XMM0');
  649. Item.Values.Add('XMM4' + sSuffix);
  650. Item.Values.Add('XMM4');
  651. Item.Values.Add('XMM8' + sSuffix);
  652. Item.Values.Add('XMM8');
  653. Item.Values.Add('XMM12' + sSuffix);
  654. Item.Values.Add('XMM12');
  655. Item.Values.Add('XMM15' + sSuffix);
  656. Item.Values.Add('XMM15');
  657. end;
  658. //Item.Values.Add('[RIP]');
  659. //Item.Values.Add('[RIP + 16]');
  660. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  661. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  662. end
  663. else
  664. begin
  665. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  666. end;
  667. end
  668. else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
  669. (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
  670. (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
  671. (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
  672. (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
  673. then
  674. begin
  675. Item.OpNumber := il_Op;
  676. Item.OpTyp := otXMMRM16;
  677. Item.OpActive := true;
  678. if UsePrefix then sl_Prefix := 'word ';
  679. sSuffix := '';
  680. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  681. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  682. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  683. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  684. Item.Values.Add('XMM0' + sSuffix);
  685. Item.Values.Add('XMM1' + sSuffix);
  686. Item.Values.Add('XMM2' + sSuffix);
  687. Item.Values.Add('XMM3' + sSuffix);
  688. Item.Values.Add('XMM4' + sSuffix);
  689. Item.Values.Add('XMM5' + sSuffix);
  690. Item.Values.Add('XMM6' + sSuffix);
  691. Item.Values.Add('XMM7' + sSuffix);
  692. if x64 then
  693. begin
  694. Item.Values.Clear;
  695. if FAVX512 then
  696. begin
  697. Item.Values.Add('XMM0' + sSuffix);
  698. Item.Values.Add('XMM0');
  699. Item.Values.Add('XMM9' + sSuffix);
  700. Item.Values.Add('XMM9');
  701. Item.Values.Add('XMM18' + sSuffix);
  702. Item.Values.Add('XMM18');
  703. Item.Values.Add('XMM27' + sSuffix);
  704. Item.Values.Add('XMM27');
  705. Item.Values.Add('XMM31' + sSuffix);
  706. Item.Values.Add('XMM31');
  707. end
  708. else
  709. begin
  710. Item.Values.Add('XMM0' + sSuffix);
  711. Item.Values.Add('XMM0');
  712. Item.Values.Add('XMM4' + sSuffix);
  713. Item.Values.Add('XMM4');
  714. Item.Values.Add('XMM8' + sSuffix);
  715. Item.Values.Add('XMM8');
  716. Item.Values.Add('XMM12' + sSuffix);
  717. Item.Values.Add('XMM12');
  718. Item.Values.Add('XMM15' + sSuffix);
  719. Item.Values.Add('XMM15');
  720. end;
  721. //Item.Values.Add('[RIP]');
  722. //Item.Values.Add('[RIP + 16]');
  723. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  724. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  725. end
  726. else
  727. begin
  728. MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  729. end;
  730. end
  731. else if (AnsiSameText(sl_Operand, 'YMMREG')) or
  732. (AnsiSameText(sl_Operand, 'YMMREG_M')) or
  733. (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
  734. (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
  735. (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
  736. then
  737. begin
  738. Item.OpNumber := il_Op;
  739. Item.OpTyp := otYMMReg;
  740. Item.OpActive := true;
  741. sSuffix := '';
  742. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  743. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  744. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  745. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  746. Item.Values.Add('YMM0' + sSuffix);
  747. Item.Values.Add('YMM1' + sSuffix);
  748. Item.Values.Add('YMM2' + sSuffix);
  749. Item.Values.Add('YMM3' + sSuffix);
  750. Item.Values.Add('YMM4' + sSuffix);
  751. Item.Values.Add('YMM5' + sSuffix);
  752. Item.Values.Add('YMM6' + sSuffix);
  753. Item.Values.Add('YMM7' + sSuffix);
  754. if x64 then
  755. begin
  756. Item.Values.Clear;
  757. if FAVX512 then
  758. begin
  759. Item.Values.Add('YMM0' + sSuffix);
  760. Item.Values.Add('YMM9' + sSuffix);
  761. Item.Values.Add('YMM18' + sSuffix);
  762. Item.Values.Add('YMM27' + sSuffix);
  763. Item.Values.Add('YMM31' + sSuffix);
  764. if sSuffix <> '' then
  765. begin
  766. Item.Values.Add('YMM0');
  767. Item.Values.Add('YMM9');
  768. Item.Values.Add('YMM18');
  769. Item.Values.Add('YMM27');
  770. Item.Values.Add('YMM31');
  771. end;
  772. end
  773. else
  774. begin
  775. Item.Values.Add('YMM0' + sSuffix);
  776. Item.Values.Add('YMM4' + sSuffix);
  777. Item.Values.Add('YMM8' + sSuffix);
  778. Item.Values.Add('YMM12' + sSuffix);
  779. Item.Values.Add('YMM15' + sSuffix);
  780. if sSuffix <> '' then
  781. begin
  782. Item.Values.Add('YMM0');
  783. Item.Values.Add('YMM4');
  784. Item.Values.Add('YMM8');
  785. Item.Values.Add('YMM12');
  786. Item.Values.Add('YMM15');
  787. end;
  788. end;
  789. end;
  790. end
  791. else if (AnsiSameText(sl_Operand, 'YMMRM')) or
  792. (AnsiSameText(sl_Operand, 'YMMRM_M')) or
  793. (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
  794. (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
  795. (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
  796. then
  797. begin
  798. Item.OpNumber := il_Op;
  799. Item.OpTyp := otYMMRM;
  800. Item.OpActive := true;
  801. if UsePrefix then sl_Prefix := 'yword ';
  802. sSuffix := '';
  803. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  804. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  805. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  806. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  807. Item.Values.Add('YMM0' + sSuffix);
  808. Item.Values.Add('YMM1' + sSuffix);
  809. Item.Values.Add('YMM2' + sSuffix);
  810. Item.Values.Add('YMM3' + sSuffix);
  811. Item.Values.Add('YMM4' + sSuffix);
  812. Item.Values.Add('YMM5' + sSuffix);
  813. Item.Values.Add('YMM6' + sSuffix);
  814. Item.Values.Add('YMM7' + sSuffix);
  815. if x64 then
  816. begin
  817. Item.Values.Clear;
  818. if FAVX512 then
  819. begin
  820. Item.Values.Add('YMM0' + sSuffix);
  821. Item.Values.Add('YMM9' + sSuffix);
  822. Item.Values.Add('YMM18' + sSuffix);
  823. Item.Values.Add('YMM27' + sSuffix);
  824. Item.Values.Add('YMM31' + sSuffix);
  825. if sSuffix <> '' then
  826. begin
  827. Item.Values.Add('YMM0');
  828. Item.Values.Add('YMM9');
  829. Item.Values.Add('YMM18');
  830. Item.Values.Add('YMM27');
  831. Item.Values.Add('YMM31');
  832. end;
  833. end
  834. else
  835. begin
  836. Item.Values.Add('YMM0' + sSuffix);
  837. Item.Values.Add('YMM4' + sSuffix);
  838. Item.Values.Add('YMM8' + sSuffix);
  839. Item.Values.Add('YMM12' + sSuffix);
  840. Item.Values.Add('YMM15' + sSuffix);
  841. if sSuffix <> '' then
  842. begin
  843. Item.Values.Add('YMM0');
  844. Item.Values.Add('YMM4');
  845. Item.Values.Add('YMM8');
  846. Item.Values.Add('YMM12');
  847. Item.Values.Add('YMM15');
  848. end;
  849. end;
  850. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  851. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  852. end
  853. else
  854. begin
  855. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  856. end;
  857. end
  858. else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
  859. (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
  860. (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
  861. (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
  862. (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
  863. then
  864. begin
  865. Item.OpNumber := il_Op;
  866. Item.OpTyp := otZMMReg;
  867. Item.OpActive := true;
  868. sSuffix := '';
  869. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  870. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  871. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  872. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  873. Item.Values.Add('ZMM0' + sSuffix);
  874. Item.Values.Add('ZMM1' + sSuffix);
  875. Item.Values.Add('ZMM2' + sSuffix);
  876. Item.Values.Add('ZMM3' + sSuffix);
  877. Item.Values.Add('ZMM4' + sSuffix);
  878. Item.Values.Add('ZMM5' + sSuffix);
  879. Item.Values.Add('ZMM6' + sSuffix);
  880. Item.Values.Add('ZMM7' + sSuffix);
  881. if x64 then
  882. begin
  883. Item.Values.Clear;
  884. if FAVX512 then
  885. begin
  886. Item.Values.Add('ZMM0' + sSuffix);
  887. Item.Values.Add('ZMM9' + sSuffix);
  888. Item.Values.Add('ZMM18' + sSuffix);
  889. Item.Values.Add('ZMM27' + sSuffix);
  890. Item.Values.Add('ZMM31' + sSuffix);
  891. if sSuffix <> '' then
  892. begin
  893. Item.Values.Add('ZMM0');
  894. Item.Values.Add('ZMM9');
  895. Item.Values.Add('ZMM18');
  896. Item.Values.Add('ZMM27');
  897. Item.Values.Add('ZMM31');
  898. end;
  899. end
  900. else
  901. begin
  902. Item.Values.Add('ZMM0' + sSuffix);
  903. Item.Values.Add('ZMM4' + sSuffix);
  904. Item.Values.Add('ZMM8' + sSuffix);
  905. Item.Values.Add('ZMM12' + sSuffix);
  906. Item.Values.Add('ZMM15' + sSuffix);
  907. end;
  908. end;
  909. end
  910. else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
  911. (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
  912. (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
  913. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  914. (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
  915. then
  916. begin
  917. Item.OpNumber := il_Op;
  918. Item.OpTyp := otZMMRM;
  919. Item.OpActive := true;
  920. if UsePrefix then sl_Prefix := 'zword ';
  921. sSuffix := '';
  922. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  923. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  924. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  925. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  926. Item.Values.Add('ZMM0' + sSuffix);
  927. Item.Values.Add('ZMM1' + sSuffix);
  928. Item.Values.Add('ZMM2' + sSuffix);
  929. Item.Values.Add('ZMM3' + sSuffix);
  930. Item.Values.Add('ZMM4' + sSuffix);
  931. Item.Values.Add('ZMM5' + sSuffix);
  932. Item.Values.Add('ZMM6' + sSuffix);
  933. Item.Values.Add('ZMM7' + sSuffix);
  934. if x64 then
  935. begin
  936. Item.Values.Clear;
  937. if FAVX512 then
  938. begin
  939. Item.Values.Add('ZMM0' + sSuffix);
  940. Item.Values.Add('ZMM9' + sSuffix);
  941. Item.Values.Add('ZMM18' + sSuffix);
  942. Item.Values.Add('ZMM27' + sSuffix);
  943. Item.Values.Add('ZMM31' + sSuffix);
  944. if sSuffix <> '' then
  945. begin
  946. Item.Values.Add('ZMM0');
  947. Item.Values.Add('ZMM9');
  948. Item.Values.Add('ZMM18');
  949. Item.Values.Add('ZMM27');
  950. Item.Values.Add('ZMM31');
  951. end;
  952. end
  953. else
  954. begin
  955. Item.Values.Add('ZMM0' + sSuffix);
  956. Item.Values.Add('ZMM4' + sSuffix);
  957. Item.Values.Add('ZMM8' + sSuffix);
  958. Item.Values.Add('ZMM12' + sSuffix);
  959. Item.Values.Add('ZMM15' + sSuffix);
  960. end;
  961. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  962. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  963. end
  964. else
  965. begin
  966. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  967. end;
  968. end
  969. else if AnsiSameText(sl_Operand, 'MEM8') then
  970. begin
  971. Item.OpNumber := il_Op;
  972. Item.OpTyp := otMEM8;
  973. Item.OpActive := true;
  974. if UsePrefix then sl_Prefix := 'byte ';
  975. sSuffix := '';
  976. if x64 then
  977. begin
  978. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  979. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  980. end
  981. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  982. end
  983. else if AnsiSameText(sl_Operand, 'MEM16') or
  984. AnsiSameText(sl_Operand, 'MEM16_M') then
  985. begin
  986. Item.OpNumber := il_Op;
  987. Item.OpTyp := otMEM16;
  988. Item.OpActive := true;
  989. if UsePrefix then sl_Prefix := 'word ';
  990. sSuffix := '';
  991. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  992. if x64 then
  993. begin
  994. MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  995. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  996. end
  997. else MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  998. end
  999. else if AnsiSameText(sl_Operand, 'MEM32') or
  1000. AnsiSameText(sl_Operand, 'MEM32_M') or
  1001. AnsiSameText(sl_Operand, 'MEM32_MZ') then
  1002. begin
  1003. Item.OpNumber := il_Op;
  1004. Item.OpTyp := otMEM32;
  1005. Item.OpActive := true;
  1006. if UsePrefix then sl_Prefix := 'dword ';
  1007. sSuffix := '';
  1008. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1009. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1010. if x64 then
  1011. begin
  1012. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1013. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1014. end
  1015. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1016. end
  1017. else if (AnsiSameText(sl_Operand, 'MEM64')) or
  1018. (AnsiSameText(sl_Operand, 'MEM64_M')) or
  1019. (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
  1020. begin
  1021. Item.OpNumber := il_Op;
  1022. Item.OpTyp := otMEM64;
  1023. Item.OpActive := true;
  1024. if UsePrefix then sl_Prefix := 'qword ';
  1025. sSuffix := '';
  1026. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1027. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1028. if x64 then
  1029. begin
  1030. MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1031. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1032. end
  1033. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1034. end
  1035. else if (AnsiSameText(sl_Operand, 'MEM128')) or
  1036. (AnsiSameText(sl_Operand, 'MEM128_M')) or
  1037. (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
  1038. begin
  1039. Item.OpNumber := il_Op;
  1040. Item.OpTyp := otMEM128;
  1041. Item.OpActive := true;
  1042. if UsePrefix then sl_Prefix := 'oword ';
  1043. sSuffix := '';
  1044. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1045. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1046. if x64 then
  1047. begin
  1048. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1049. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1050. end
  1051. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1052. end
  1053. else if (AnsiSameText(sl_Operand, 'MEM256')) or
  1054. (AnsiSameText(sl_Operand, 'MEM256_M')) or
  1055. (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
  1056. begin
  1057. Item.OpNumber := il_Op;
  1058. Item.OpTyp := otMEM256;
  1059. Item.OpActive := true;
  1060. if UsePrefix then sl_Prefix := 'yword ';
  1061. sSuffix := '';
  1062. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1063. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1064. if x64 then
  1065. begin
  1066. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1067. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1068. end
  1069. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1070. end
  1071. else if (AnsiSameText(sl_Operand, 'MEM512')) or
  1072. (AnsiSameText(sl_Operand, 'MEM512_M')) or
  1073. (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
  1074. begin
  1075. Item.OpNumber := il_Op;
  1076. Item.OpTyp := otMEM512;
  1077. Item.OpActive := true;
  1078. if UsePrefix then sl_Prefix := 'zword ';
  1079. sSuffix := '';
  1080. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1081. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1082. if x64 then
  1083. begin
  1084. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1085. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1086. end
  1087. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1088. end
  1089. else if AnsiSameText(sl_Operand, 'REG8') then
  1090. begin
  1091. Item.OpNumber := il_Op;
  1092. Item.OpTyp := otREG8;
  1093. Item.OpActive := true;
  1094. if x64 then
  1095. begin
  1096. Item.Values.AddStrings(FReg8);
  1097. end
  1098. else Item.Values.AddStrings(FReg8);
  1099. end
  1100. else if AnsiSameText(sl_Operand, 'REG16') then
  1101. begin
  1102. Item.OpNumber := il_Op;
  1103. Item.OpTyp := otREG16;
  1104. Item.OpActive := true;
  1105. if x64 then
  1106. begin
  1107. Item.Values.AddStrings(FReg16);
  1108. end
  1109. else Item.Values.AddStrings(FReg16);
  1110. end
  1111. else if AnsiSameText(sl_Operand, 'REG32') then
  1112. begin
  1113. Item.OpNumber := il_Op;
  1114. Item.OpTyp := otREG32;
  1115. Item.OpActive := true;
  1116. if x64 then
  1117. begin
  1118. Item.Values.AddStrings(FReg32Base);
  1119. end
  1120. else Item.Values.AddStrings(FReg32Base);
  1121. end
  1122. else if AnsiSameText(sl_Operand, 'REG64') then
  1123. begin
  1124. Item.OpNumber := il_Op;
  1125. Item.OpTyp := otREG64;
  1126. Item.OpActive := true;
  1127. if x64 then
  1128. begin
  1129. Item.Values.AddStrings(FReg64Base);
  1130. end;
  1131. end
  1132. else if AnsiSameText(sl_Operand, 'RM32') then
  1133. begin
  1134. Item.OpNumber := il_Op;
  1135. Item.OpTyp := otRM32;
  1136. Item.OpActive := true;
  1137. Item.Values.AddStrings(FReg32Base);
  1138. if UsePrefix then sl_Prefix := 'dword ';
  1139. if x64 then
  1140. begin
  1141. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1142. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1143. end
  1144. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1145. end
  1146. else if AnsiSameText(sl_Operand, 'RM64') then
  1147. begin
  1148. Item.OpNumber := il_Op;
  1149. Item.OpTyp := otRM32;
  1150. Item.OpActive := true;
  1151. if UsePrefix then sl_Prefix := 'qword ';
  1152. if x64 then
  1153. begin
  1154. Item.Values.AddStrings(FReg64Base);
  1155. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1156. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1157. end
  1158. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1159. end
  1160. else if AnsiSameText(sl_Operand, 'IMM8') then
  1161. begin
  1162. Item.OpNumber := il_Op;
  1163. Item.OpTyp := otIMM8;
  1164. Item.OpActive := true;
  1165. Item.Values.Add('0');
  1166. end
  1167. else if AnsiSameText(sl_Operand, 'XMEM32') or
  1168. AnsiSameText(sl_Operand, 'XMEM32_M') then
  1169. begin
  1170. Item.OpNumber := il_Op;
  1171. Item.OpTyp := otXMEM32;
  1172. Item.OpActive := true;
  1173. if UsePrefix then sl_Prefix := 'oword ';
  1174. sSuffix := '';
  1175. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1176. if x64 then
  1177. begin
  1178. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  1179. if sSuffix <> '' then
  1180. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  1181. end
  1182. else
  1183. begin
  1184. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  1185. if sSuffix <> '' then
  1186. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  1187. end;
  1188. end
  1189. else if AnsiSameText(sl_Operand, 'XMEM64') or
  1190. AnsiSameText(sl_Operand, 'XMEM64_M') then
  1191. begin
  1192. Item.OpNumber := il_Op;
  1193. Item.OpTyp := otXMEM64;
  1194. Item.OpActive := true;
  1195. //if UsePrefix then sl_Prefix := 'oword ';
  1196. //
  1197. //if x64 then
  1198. //begin
  1199. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
  1200. //end
  1201. //else
  1202. //begin
  1203. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
  1204. //end;
  1205. sSuffix := '';
  1206. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1207. if x64 then
  1208. begin
  1209. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  1210. if sSuffix <> '' then
  1211. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  1212. end
  1213. else
  1214. begin
  1215. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  1216. if sSuffix <> '' then
  1217. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  1218. end;
  1219. end
  1220. else if AnsiSameText(sl_Operand, 'YMEM32') or
  1221. AnsiSameText(sl_Operand, 'YMEM32_M') then
  1222. begin
  1223. Item.OpNumber := il_Op;
  1224. Item.OpTyp := otYMEM32;
  1225. Item.OpActive := true;
  1226. if UsePrefix then sl_Prefix := 'yword ';
  1227. //if x64 then
  1228. //begin
  1229. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  1230. //end
  1231. //else
  1232. //begin
  1233. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  1234. //end;
  1235. sSuffix := '';
  1236. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1237. if x64 then
  1238. begin
  1239. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  1240. if sSuffix <> '' then
  1241. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  1242. end
  1243. else
  1244. begin
  1245. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  1246. if sSuffix <> '' then
  1247. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  1248. end;
  1249. end
  1250. else if AnsiSameText(sl_Operand, 'YMEM64') or
  1251. AnsiSameText(sl_Operand, 'YMEM64_M') then
  1252. begin
  1253. Item.OpNumber := il_Op;
  1254. Item.OpTyp := otYMEM64;
  1255. Item.OpActive := true;
  1256. if UsePrefix then sl_Prefix := 'yword ';
  1257. //if x64 then
  1258. //begin
  1259. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  1260. //end
  1261. //else
  1262. //begin
  1263. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  1264. //end;
  1265. sSuffix := '';
  1266. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1267. if x64 then
  1268. begin
  1269. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  1270. if sSuffix <> '' then
  1271. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  1272. end
  1273. else
  1274. begin
  1275. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  1276. if sSuffix <> '' then
  1277. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  1278. end;
  1279. end
  1280. else if AnsiSameText(sl_Operand, 'ZMEM32') or
  1281. AnsiSameText(sl_Operand, 'ZMEM32_M') then
  1282. begin
  1283. Item.OpNumber := il_Op;
  1284. Item.OpTyp := otZMEM32;
  1285. Item.OpActive := true;
  1286. if UsePrefix then sl_Prefix := 'zword ';
  1287. //if x64 then
  1288. //begin
  1289. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1290. //end
  1291. //else
  1292. //begin
  1293. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1294. //end;
  1295. sSuffix := '';
  1296. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1297. if x64 then
  1298. begin
  1299. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1300. if sSuffix <> '' then
  1301. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  1302. end
  1303. else
  1304. begin
  1305. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1306. if sSuffix <> '' then
  1307. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  1308. end;
  1309. end
  1310. else if AnsiSameText(sl_Operand, 'ZMEM64') or
  1311. AnsiSameText(sl_Operand, 'ZMEM64_M') then
  1312. begin
  1313. Item.OpNumber := il_Op;
  1314. Item.OpTyp := otZMEM64;
  1315. Item.OpActive := true;
  1316. if UsePrefix then sl_Prefix := 'zword ';
  1317. //if x64 then
  1318. //begin
  1319. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1320. //end
  1321. //else
  1322. //begin
  1323. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1324. //end;
  1325. sSuffix := '';
  1326. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1327. if x64 then
  1328. begin
  1329. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1330. if sSuffix <> '' then
  1331. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  1332. end
  1333. else
  1334. begin
  1335. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1336. if sSuffix <> '' then
  1337. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  1338. end;
  1339. end
  1340. else if AnsiSameText(sl_Operand, '2B32') then
  1341. begin
  1342. Item.OpNumber := il_Op;
  1343. Item.OpTyp := otB32;
  1344. Item.OpActive := true;
  1345. if x64 then
  1346. begin
  1347. MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  1348. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1349. end
  1350. else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  1351. end
  1352. else if AnsiSameText(sl_Operand, '4B32') then
  1353. begin
  1354. Item.OpNumber := il_Op;
  1355. Item.OpTyp := otB32;
  1356. Item.OpActive := true;
  1357. if x64 then
  1358. begin
  1359. MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  1360. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1361. end
  1362. else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  1363. end
  1364. else if AnsiSameText(sl_Operand, '8B32') then
  1365. begin
  1366. Item.OpNumber := il_Op;
  1367. Item.OpTyp := otB32;
  1368. Item.OpActive := true;
  1369. if x64 then
  1370. begin
  1371. MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  1372. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1373. end
  1374. else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  1375. end
  1376. else if AnsiSameText(sl_Operand, '16B32') then
  1377. begin
  1378. Item.OpNumber := il_Op;
  1379. Item.OpTyp := otB32;
  1380. Item.OpActive := true;
  1381. if x64 then
  1382. begin
  1383. MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  1384. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1385. end
  1386. else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  1387. end
  1388. else if AnsiSameText(sl_Operand, '2B64') then
  1389. begin
  1390. Item.OpNumber := il_Op;
  1391. Item.OpTyp := otB64;
  1392. Item.OpActive := true;
  1393. if x64 then
  1394. begin
  1395. MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  1396. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1397. end
  1398. else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  1399. end
  1400. else if AnsiSameText(sl_Operand, '4B64') then
  1401. begin
  1402. Item.OpNumber := il_Op;
  1403. Item.OpTyp := otB64;
  1404. Item.OpActive := true;
  1405. if x64 then
  1406. begin
  1407. MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  1408. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1409. end
  1410. else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  1411. end
  1412. else if AnsiSameText(sl_Operand, '8B64') then
  1413. begin
  1414. Item.OpNumber := il_Op;
  1415. Item.OpTyp := otB64;
  1416. Item.OpActive := true;
  1417. if x64 then
  1418. begin
  1419. MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  1420. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1421. end
  1422. else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  1423. end
  1424. else if AnsiSameText(sl_Operand, '16B64') then
  1425. begin
  1426. Item.OpNumber := il_Op;
  1427. Item.OpTyp := otB64;
  1428. Item.OpActive := true;
  1429. if x64 then
  1430. begin
  1431. MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  1432. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1433. end
  1434. else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  1435. end
  1436. else if AnsiSameText(sl_Operand, 'KREG') or
  1437. AnsiSameText(sl_Operand, 'KREG_M') then
  1438. begin
  1439. Item.OpNumber := il_Op;
  1440. Item.OpTyp := otKREG;
  1441. Item.OpActive := true;
  1442. sSuffix := '';
  1443. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1444. if UsePrefix then sl_Prefix := '';
  1445. for i := 0 to FRegKREG.Count - 1 do
  1446. Item.Values.Add(FRegKREG[i] + sSuffix);
  1447. end
  1448. else if trim(sl_Operand) = '' then
  1449. begin
  1450. Item.OpNumber := il_Op;
  1451. Item.OpTyp := otUnknown;
  1452. Item.OpActive := false;
  1453. Item.Values.Add('');
  1454. end
  1455. else
  1456. begin
  1457. Item.OpNumber := il_Op;
  1458. Item.OpTyp := otUnknown;
  1459. Item.OpActive := false;
  1460. Item.Values.Add('?' + sl_Operand);
  1461. end
  1462. end;
  1463. sl_RegCombi := '';
  1464. il_Operands := 0;
  1465. UsedParams := 0;
  1466. if OItem1.OpActive then
  1467. begin
  1468. inc(il_Operands);
  1469. UsedParams := UsedParams or 1;
  1470. end;
  1471. if OItem2.OpActive then
  1472. begin
  1473. inc(il_Operands);
  1474. UsedParams := UsedParams or 2;
  1475. end;
  1476. if OItem3.OpActive then
  1477. begin
  1478. inc(il_Operands);
  1479. UsedParams := UsedParams or 4;
  1480. end;
  1481. if OItem4.OpActive then
  1482. begin
  1483. inc(il_Operands);
  1484. UsedParams := UsedParams or 8;
  1485. end;
  1486. case il_Operands of
  1487. 1: UseDefault := UsedParams <> 1;
  1488. 2: UseDefault := UsedParams <> 3;
  1489. 3: UseDefault := UsedParams <> 7;
  1490. 4: UseDefault := UsedParams <> 15;
  1491. else UseDefault := true;
  1492. end;
  1493. //UseDefault := true;
  1494. if UseDefault then
  1495. begin
  1496. sl_Inst := format('%-20s', [aInst]);
  1497. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  1498. begin
  1499. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  1500. begin
  1501. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  1502. begin
  1503. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  1504. begin
  1505. sl_RegCombi := '';
  1506. if OItem1.OpActive then
  1507. begin
  1508. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  1509. sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
  1510. end;
  1511. if OItem2.OpActive then
  1512. begin
  1513. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  1514. sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
  1515. end;
  1516. if OItem3.OpActive then
  1517. begin
  1518. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  1519. sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
  1520. end;
  1521. if OItem4.OpActive then
  1522. begin
  1523. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  1524. sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
  1525. end;
  1526. if sl_RegCombi <> '' then
  1527. begin
  1528. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  1529. result.Add(sl_Inst + sl_RegCombi);
  1530. sl_RegCombi := '';
  1531. end;
  1532. end;
  1533. end;
  1534. end;
  1535. end;
  1536. end
  1537. else
  1538. begin
  1539. sl_Inst := format('%-20s', [aInst]);
  1540. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  1541. begin
  1542. if OItem1.OpActive then
  1543. begin
  1544. sl_RegCombi1 := OItem1.Values[il_Op1];
  1545. end
  1546. else sl_RegCombi1 := '';
  1547. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  1548. begin
  1549. if OItem2.OpActive then
  1550. begin
  1551. sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
  1552. end
  1553. else sl_RegCombi2 := sl_RegCombi1;
  1554. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  1555. begin
  1556. if OItem3.OpActive then
  1557. begin
  1558. sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
  1559. end
  1560. else sl_RegCombi3 := sl_RegCombi2;
  1561. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  1562. begin
  1563. if OItem4.OpActive then
  1564. begin
  1565. sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
  1566. end
  1567. else sl_RegCombi := sl_RegCombi3;
  1568. if sl_RegCombi <> '' then
  1569. begin
  1570. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  1571. result.Add(sl_Inst + sl_RegCombi);
  1572. sl_RegCombi := '';
  1573. end;
  1574. end;
  1575. end;
  1576. end;
  1577. end;
  1578. end;
  1579. finally
  1580. FreeAndNil(OItem4);
  1581. end;
  1582. finally
  1583. FreeAndNil(OItem3);
  1584. end;
  1585. finally
  1586. FreeAndNil(OItem2);
  1587. end;
  1588. finally
  1589. FreeAndNil(OItem1);
  1590. end;
  1591. end;
  1592. constructor TAsmTestGenerator.Create;
  1593. begin
  1594. inherited;
  1595. FX64 := true;
  1596. FAVX512 := false;
  1597. FReg8 := TStringList.Create;
  1598. FReg16 := TStringList.Create;
  1599. FReg32Base := TStringList.Create;
  1600. FReg32Index := TStringList.Create;
  1601. FReg64Base := TStringList.Create;
  1602. FReg64Index := TStringList.Create;
  1603. FReg6432Base := TStringList.Create;
  1604. FReg6432Index := TStringList.Create;
  1605. FReg32XMMIndex := TStringList.Create;
  1606. FReg32YMMIndex := TStringList.Create;
  1607. FReg32ZMMIndex := TStringList.Create;
  1608. FReg64XMMIndex := TStringList.Create;
  1609. FReg64YMMIndex := TStringList.Create;
  1610. FReg64ZMMIndex := TStringList.Create;
  1611. FRegKREG := TStringList.Create;
  1612. FReg8.Add('AL');
  1613. FReg8.Add('BL');
  1614. FReg8.Add('CL');
  1615. FReg8.Add('DL');
  1616. FReg16.Add('AX');
  1617. FReg16.Add('BX');
  1618. FReg16.Add('CX');
  1619. FReg16.Add('DX');
  1620. FReg32Base.Add('EAX');
  1621. FReg32Base.Add('EBX');
  1622. FReg32Base.Add('ECX');
  1623. FReg32Base.Add('EDX');
  1624. //FReg32Base.Add('ESP');
  1625. //FReg32Base.Add('EBP');
  1626. FReg32Base.Add('EDI');
  1627. FReg32Base.Add('ESI');
  1628. FReg32Index.Add('EAX');
  1629. FReg32Index.Add('EBX');
  1630. FReg32Index.Add('ECX');
  1631. FReg32Index.Add('EDX');
  1632. //FReg32Index.Add('EBP');
  1633. FReg32Index.Add('EDI');
  1634. FReg32Index.Add('ESI');
  1635. FReg64Base.Add('RAX');
  1636. FReg64Base.Add('RBX');
  1637. FReg64Base.Add('RCX');
  1638. FReg64Base.Add('RDX');
  1639. //FReg64Base.Add('RSP');
  1640. //FReg64Base.Add('RBP');
  1641. FReg64Base.Add('RDI');
  1642. FReg64Base.Add('RSI');
  1643. FReg64Base.Add('R8');
  1644. FReg64Base.Add('R9');
  1645. FReg64Base.Add('R10');
  1646. FReg64Base.Add('R11');
  1647. FReg64Base.Add('R12');
  1648. FReg64Base.Add('R13');
  1649. FReg64Base.Add('R14');
  1650. FReg64Base.Add('R15');
  1651. FReg64Index.Add('RAX');
  1652. FReg64Index.Add('RBX');
  1653. FReg64Index.Add('RCX');
  1654. FReg64Index.Add('RDX');
  1655. //FReg64Index.Add('RBP');
  1656. FReg64Index.Add('RDI');
  1657. FReg64Index.Add('RSI');
  1658. FReg64Index.Add('R8');
  1659. FReg64Index.Add('R9');
  1660. FReg64Index.Add('R10');
  1661. FReg64Index.Add('R11');
  1662. FReg64Index.Add('R12');
  1663. FReg64Index.Add('R13');
  1664. FReg64Index.Add('R14');
  1665. FReg64Index.Add('R15');
  1666. FReg6432Base.Add('EAX');
  1667. FReg6432Base.Add('EBX');
  1668. FReg6432Base.Add('ECX');
  1669. FReg6432Base.Add('EDX');
  1670. FReg6432Base.Add('ESP');
  1671. //FReg6432Base.Add('EBP');
  1672. FReg6432Base.Add('EDI');
  1673. FReg6432Base.Add('ESI');
  1674. FReg6432Base.Add('R8D');
  1675. FReg6432Base.Add('R9D');
  1676. FReg6432Base.Add('R10D');
  1677. FReg6432Base.Add('R11D');
  1678. FReg6432Base.Add('R12D');
  1679. FReg6432Base.Add('R13D');
  1680. FReg6432Base.Add('R14D');
  1681. FReg6432Base.Add('R15D');
  1682. FReg6432Index.Add('EAX');
  1683. FReg6432Index.Add('EBX');
  1684. FReg6432Index.Add('ECX');
  1685. FReg6432Index.Add('EDX');
  1686. //FReg6432Index.Add('EBP');
  1687. FReg6432Index.Add('EDI');
  1688. FReg6432Index.Add('ESI');
  1689. FReg6432Index.Add('R8D');
  1690. FReg6432Index.Add('R9D');
  1691. FReg6432Index.Add('R10D');
  1692. FReg6432Index.Add('R11D');
  1693. FReg6432Index.Add('R12D');
  1694. FReg6432Index.Add('R13D');
  1695. FReg6432Index.Add('R14D');
  1696. FReg6432Index.Add('R15D');
  1697. FReg32XMMIndex.ADD('XMM0');
  1698. FReg32XMMIndex.ADD('XMM1');
  1699. FReg32XMMIndex.ADD('XMM2');
  1700. FReg32XMMIndex.ADD('XMM3');
  1701. FReg32XMMIndex.ADD('XMM4');
  1702. FReg32XMMIndex.ADD('XMM5');
  1703. FReg32XMMIndex.ADD('XMM6');
  1704. FReg32XMMIndex.ADD('XMM7');
  1705. FReg32YMMIndex.ADD('YMM0');
  1706. FReg32YMMIndex.ADD('YMM1');
  1707. FReg32YMMIndex.ADD('YMM2');
  1708. FReg32YMMIndex.ADD('YMM3');
  1709. FReg32YMMIndex.ADD('YMM4');
  1710. FReg32YMMIndex.ADD('YMM5');
  1711. FReg32YMMIndex.ADD('YMM6');
  1712. FReg32YMMIndex.ADD('YMM7');
  1713. FReg32ZMMIndex.ADD('ZMM0');
  1714. FReg32ZMMIndex.ADD('ZMM1');
  1715. FReg32ZMMIndex.ADD('ZMM2');
  1716. FReg32ZMMIndex.ADD('ZMM3');
  1717. FReg32ZMMIndex.ADD('ZMM4');
  1718. FReg32ZMMIndex.ADD('ZMM5');
  1719. FReg32ZMMIndex.ADD('ZMM6');
  1720. FReg32ZMMIndex.ADD('ZMM7');
  1721. FReg64XMMIndex.ADD('XMM0');
  1722. FReg64XMMIndex.ADD('XMM1');
  1723. FReg64XMMIndex.ADD('XMM2');
  1724. FReg64XMMIndex.ADD('XMM3');
  1725. FReg64XMMIndex.ADD('XMM4');
  1726. FReg64XMMIndex.ADD('XMM5');
  1727. FReg64XMMIndex.ADD('XMM6');
  1728. FReg64XMMIndex.ADD('XMM7');
  1729. FReg64XMMIndex.ADD('XMM8');
  1730. FReg64XMMIndex.ADD('XMM9');
  1731. FReg64XMMIndex.ADD('XMM10');
  1732. FReg64XMMIndex.ADD('XMM11');
  1733. FReg64XMMIndex.ADD('XMM12');
  1734. FReg64XMMIndex.ADD('XMM13');
  1735. FReg64XMMIndex.ADD('XMM14');
  1736. FReg64XMMIndex.ADD('XMM15');
  1737. FReg64YMMIndex.ADD('YMM0');
  1738. FReg64YMMIndex.ADD('YMM1');
  1739. FReg64YMMIndex.ADD('YMM2');
  1740. FReg64YMMIndex.ADD('YMM3');
  1741. FReg64YMMIndex.ADD('YMM4');
  1742. FReg64YMMIndex.ADD('YMM5');
  1743. FReg64YMMIndex.ADD('YMM6');
  1744. FReg64YMMIndex.ADD('YMM7');
  1745. FReg64YMMIndex.ADD('YMM8');
  1746. FReg64YMMIndex.ADD('YMM9');
  1747. FReg64YMMIndex.ADD('YMM10');
  1748. FReg64YMMIndex.ADD('YMM11');
  1749. FReg64YMMIndex.ADD('YMM12');
  1750. FReg64YMMIndex.ADD('YMM13');
  1751. FReg64YMMIndex.ADD('YMM14');
  1752. FReg64YMMIndex.ADD('YMM15');
  1753. FReg64ZMMIndex.ADD('ZMM0');
  1754. FReg64ZMMIndex.ADD('ZMM1');
  1755. FReg64ZMMIndex.ADD('ZMM2');
  1756. FReg64ZMMIndex.ADD('ZMM3');
  1757. FReg64ZMMIndex.ADD('ZMM4');
  1758. FReg64ZMMIndex.ADD('ZMM5');
  1759. FReg64ZMMIndex.ADD('ZMM6');
  1760. FReg64ZMMIndex.ADD('ZMM7');
  1761. FReg64ZMMIndex.ADD('ZMM8');
  1762. FReg64ZMMIndex.ADD('ZMM9');
  1763. FReg64ZMMIndex.ADD('ZMM10');
  1764. FReg64ZMMIndex.ADD('ZMM11');
  1765. FReg64ZMMIndex.ADD('ZMM12');
  1766. FReg64ZMMIndex.ADD('ZMM13');
  1767. FReg64ZMMIndex.ADD('ZMM14');
  1768. FReg64ZMMIndex.ADD('ZMM15');
  1769. FReg64ZMMIndex.ADD('ZMM16');
  1770. FReg64ZMMIndex.ADD('ZMM17');
  1771. FReg64ZMMIndex.ADD('ZMM18');
  1772. FReg64ZMMIndex.ADD('ZMM19');
  1773. FReg64ZMMIndex.ADD('ZMM20');
  1774. FReg64ZMMIndex.ADD('ZMM21');
  1775. FReg64ZMMIndex.ADD('ZMM22');
  1776. FReg64ZMMIndex.ADD('ZMM23');
  1777. FReg64ZMMIndex.ADD('ZMM24');
  1778. FReg64ZMMIndex.ADD('ZMM25');
  1779. FReg64ZMMIndex.ADD('ZMM26');
  1780. FReg64ZMMIndex.ADD('ZMM27');
  1781. FReg64ZMMIndex.ADD('ZMM28');
  1782. FReg64ZMMIndex.ADD('ZMM29');
  1783. FReg64ZMMIndex.ADD('ZMM30');
  1784. FReg64ZMMIndex.ADD('ZMM31');
  1785. FRegKREG.ADD('K0');
  1786. FRegKREG.ADD('K1');
  1787. FRegKREG.ADD('K2');
  1788. FRegKREG.ADD('K3');
  1789. FRegKREG.ADD('K4');
  1790. FRegKREG.ADD('K5');
  1791. FRegKREG.ADD('K6');
  1792. FRegKREG.ADD('K7');
  1793. end;
  1794. destructor TAsmTestGenerator.Destroy;
  1795. begin
  1796. FreeAndNil(FReg8);
  1797. FreeAndNil(FReg16);
  1798. FreeAndNil(FReg32Base);
  1799. FreeAndNil(FReg32Index);
  1800. FreeAndNil(FReg64Base);
  1801. FreeAndNil(FReg64Index);
  1802. FreeAndNil(FReg6432Base);
  1803. FreeAndNil(FReg6432Index);
  1804. FreeAndNil(FReg32XMMIndex);
  1805. FreeAndNil(FReg32YMMIndex);
  1806. FreeAndNil(FReg32ZMMIndex);
  1807. FreeAndNil(FReg64XMMIndex);
  1808. FreeAndNil(FReg64YMMIndex);
  1809. FreeAndNil(FReg64ZMMIndex);
  1810. FreeAndnil(FRegKREG);
  1811. inherited;
  1812. end;
  1813. procedure TAsmTestGenerator.MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg,
  1814. aSLIndexReg, aRList: TStringList);
  1815. var
  1816. il_Base: integer;
  1817. il_Index: integer;
  1818. begin
  1819. for il_Base := 0 to aSLBaseReg.Count - 1 do
  1820. begin
  1821. aRList.Add(format(aPrefix + '[%s]%s', [aSLBaseReg[il_Base], aSuffix]));
  1822. for il_Index := 0 to aSLIndexReg.Count - 1 do
  1823. begin
  1824. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1825. aRList.Add(format(aPrefix + '[%s + %s + $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1826. aRList.Add(format(aPrefix + '[%s + %s + $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1827. aRList.Add(format(aPrefix + '[%s + %s - $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1828. aRList.Add(format(aPrefix + '[%s + %s - $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1829. aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1830. aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1831. aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1832. aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1833. aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1834. aRList.Add(format(aPrefix + '[%s + %s * 8 + 64]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1835. end;
  1836. end;
  1837. end;
  1838. procedure TAsmTestGenerator.VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String;
  1839. aSLBaseReg, aSLIndexReg, aRList: TStringList);
  1840. var
  1841. il_Base: integer;
  1842. il_Index: integer;
  1843. begin
  1844. //for il_Index := 0 to aSLIndexReg.Count - 1 do
  1845. //begin
  1846. // aRList.Add(format(aPrefix + '[%s]', [aSLIndexReg[il_Index]]));
  1847. //
  1848. // aRList.Add(format(aPrefix + '[%s * 2]', [aSLIndexReg[il_Index]]));
  1849. // aRList.Add(format(aPrefix + '[%s * 4]', [aSLIndexReg[il_Index]]));
  1850. // aRList.Add(format(aPrefix + '[%s * 8]', [aSLIndexReg[il_Index]]));
  1851. //
  1852. // aRList.Add(format(aPrefix + '[%s * 2 + 16]', [aSLIndexReg[il_Index]]));
  1853. // aRList.Add(format(aPrefix + '[%s * 4 + 32]', [aSLIndexReg[il_Index]]));
  1854. // aRList.Add(format(aPrefix + '[%s * 8 + 48]', [aSLIndexReg[il_Index]]));
  1855. //end;
  1856. for il_Base := 0 to aSLBaseReg.Count - 1 do
  1857. begin
  1858. //aRList.Add(format(aPrefix + '[%s]', [aSLBaseReg[il_Base]]));
  1859. for il_Index := 0 to aSLIndexReg.Count - 1 do
  1860. begin
  1861. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1862. aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1863. aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1864. aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  1865. //aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  1866. //aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  1867. //aRList.Add(format(aPrefix + '[%s + %s * 8 + 48]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  1868. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLIndexReg[il_Index], aSLBaseReg[il_Base], aSuffix]));
  1869. //aRList.Add(format(aPrefix + '[%s + %s + 16]', [aSLIndexReg[il_Index], aSLBaseReg[il_Base]]));
  1870. end;
  1871. end;
  1872. end;
  1873. class procedure TAsmTestGenerator.CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
  1874. aOp4: String; aSL: TStringList);
  1875. var
  1876. sl: TStringList;
  1877. begin
  1878. with TAsmTestGenerator.Create do
  1879. try
  1880. Fx64 := aX64;
  1881. FAVX512 := aAVX512;
  1882. FSAE := aSAE;
  1883. sl := InternalCalcTestData(aInst, aOp1, aOp2, aOp3, aOp4);
  1884. try
  1885. aSL.AddStrings(sl);
  1886. finally
  1887. FreeAndNil(sl);
  1888. end;
  1889. finally
  1890. Free;
  1891. end;
  1892. end;
  1893. class procedure TAsmTestGenerator.CalcTestInstFile;
  1894. var
  1895. i,j: integer;
  1896. sInst: string;
  1897. sI386: string;
  1898. sX8664: string;
  1899. sAVX512: string;
  1900. sOperands: string;
  1901. sLine: string;
  1902. sl: TStringList;
  1903. bVEX: boolean;
  1904. bEVEX: boolean;
  1905. b256 : boolean;
  1906. b512 : boolean;
  1907. begin
  1908. sl := TStringList.Create;
  1909. try
  1910. //tinsentry=packed record
  1911. // opcode : tasmop;
  1912. // ops : byte;
  1913. // //optypes : array[0..max_operands-1] of longint;
  1914. // optypes : array[0..3] of int64; //TG
  1915. // code : array[0..11] of char;
  1916. // flags : tinsflags;
  1917. //end;
  1918. for i := 0 to length(InsTab) - 1 do
  1919. begin
  1920. bVEX := false;
  1921. bEVEX := false;
  1922. b256 := false;
  1923. b512 := false;
  1924. //TG TODO delete
  1925. if instab[i].opcode = a_vtestps then
  1926. begin
  1927. b512 := b512;
  1928. end;
  1929. for j := 0 to length(InsTab[i].code) - 1 do
  1930. begin
  1931. case ord(InsTab[i].code[j]) of
  1932. 0: break;
  1933. 1,2,3: break;
  1934. 232: bEVEX := true;
  1935. 233: b512 := true;
  1936. 242: bVEX := true;
  1937. 244: b256 := true;
  1938. end;
  1939. end;
  1940. if bVEX or bEVEX then
  1941. begin
  1942. sInst := std_op2str[InsTab[i].opcode];
  1943. sI386 := '1';
  1944. sX8664 := '1';
  1945. if IF_X86_64 in InsTab[i].flags then
  1946. begin
  1947. sI386 := '0';
  1948. end;
  1949. if bEVEX then sAVX512 := '1'
  1950. else sAVX512 := '0';
  1951. sOperands := '';
  1952. for j := 0 to 3 do
  1953. begin
  1954. case InsTab[i].optypes[j] of
  1955. OT_XMMREG: sOperands := sOperands + 'XMMREG,';
  1956. OT_XMMREG_M: sOperands := sOperands + 'XMMREG_M,';
  1957. OT_XMMREG_MZ: sOperands := sOperands + 'XMMREG_MZ,';
  1958. OT_XMMREG_ER: sOperands := sOperands + 'XMMREG_ER,';
  1959. OT_XMMREG_SAE: sOperands := sOperands + 'XMMREG_SAE,';
  1960. OT_XMMRM: sOperands := sOperands + 'XMMRM,';
  1961. OT_XMMRM_MZ: sOperands := sOperands + 'XMMRM_MZ,';
  1962. OT_YMMREG: sOperands := sOperands + 'YMMREG,';
  1963. OT_YMMREG_M: sOperands := sOperands + 'YMMREG_M,';
  1964. OT_YMMREG_MZ: sOperands := sOperands + 'YMMREG_MZ,';
  1965. OT_YMMREG_ER: sOperands := sOperands + 'YMMREG_ER,';
  1966. OT_YMMREG_SAE: sOperands := sOperands + 'YMMREG_SAE,';
  1967. OT_YMMRM: sOperands := sOperands + 'YMMRM,';
  1968. OT_YMMRM_MZ: sOperands := sOperands + 'YMMRM_MZ,';
  1969. OT_ZMMREG: sOperands := sOperands + 'ZMMREG,';
  1970. OT_ZMMREG_M: sOperands := sOperands + 'ZMMREG_M,';
  1971. OT_ZMMREG_MZ: sOperands := sOperands + 'ZMMREG_MZ,';
  1972. OT_ZMMREG_ER: sOperands := sOperands + 'ZMMREG_ER,';
  1973. OT_ZMMREG_SAE: sOperands := sOperands + 'ZMMREG_SAE,';
  1974. OT_ZMMRM: sOperands := sOperands + 'ZMMRM,';
  1975. OT_ZMMRM_MZ: sOperands := sOperands + 'ZMMRM_MZ,';
  1976. OT_MEM32: sOperands := sOperands + 'MEM32,';
  1977. OT_MEM64: sOperands := sOperands + 'MEM64,';
  1978. OT_MEM128: sOperands := sOperands + 'MEM128,';
  1979. OT_MEM256: sOperands := sOperands + 'MEM256,';
  1980. OT_MEM512: sOperands := sOperands + 'MEM512,';
  1981. OT_REG32: sOperands := sOperands + 'REG32,';
  1982. OT_REG64: sOperands := sOperands + 'REG64,';
  1983. ot_rm_gpr or ot_bits32:
  1984. sOperands := sOperands + 'RM32,';
  1985. ot_rm_gpr or ot_bits64:
  1986. sOperands := sOperands + 'RM64,';
  1987. OT_XMEM32: sOperands := sOperands + 'XMEM32,';
  1988. OT_XMEM64: sOperands := sOperands + 'XMEM64,';
  1989. OT_YMEM32: sOperands := sOperands + 'YMEM32,';
  1990. OT_YMEM64: sOperands := sOperands + 'YMEM64,';
  1991. OT_IMM8: sOperands := sOperands + 'IMM8,';
  1992. OT_NONE: sOperands := sOperands + ',';
  1993. OT_BMEM32: if b512 then sOperands := sOperands + '16B32,'
  1994. else if b256 then sOperands := sOperands + '8B32,'
  1995. else sOperands := sOperands + '4B32,';
  1996. OT_BMEM64: if b512 then sOperands := sOperands + '8B32,'
  1997. else if b256 then sOperands := sOperands + '4B32,'
  1998. else sOperands := sOperands + '2B64,';
  1999. OT_KREG: sOperands := sOperands + 'KREG,';
  2000. OT_KREG_M: sOperands := sOperands + 'KREG_M,';
  2001. else sOperands := sOperands;
  2002. end;
  2003. end;
  2004. sOperands := copy(sOperands, 1, length(sOperands) - 1);
  2005. sl.Add(format('FOpCodeList.Add(''%s,%s,%s,%s,%s'');', [sInst, sI386, sX8664, sAVX512, sOperands]));
  2006. end;
  2007. end;
  2008. sl.Savetofile('/tmp/fpcavx512.txt');
  2009. // std_op2str
  2010. finally
  2011. FreeAndnil(sl);
  2012. end;
  2013. end;
  2014. end.