asmtestgenerator.pas 78 KB

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