asmtestgenerator.pas 78 KB

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