asmtestgenerator.pas 105 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032
  1. {
  2. Copyright (C) <avx-testfile-generator> <Torsten Grundke>
  3. This source is free software; you can redistribute it and/or modify it under
  4. the terms of the GNU General Public License as published by the Free
  5. Software Foundation; either version 2 of the License, or (at your option)
  6. any later version.
  7. This code is distributed in the hope that it will be useful, but WITHOUT ANY
  8. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. details.
  11. A copy of the GNU General Public License is available on the World Wide Web
  12. at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
  13. to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  14. MA 02110-1301, USA.
  15. }
  16. {$mode objfpc}
  17. unit asmtestgenerator;
  18. interface
  19. uses BaseList, Classes;
  20. type
  21. TOpType = (otUnknown, otXMMReg, otXMMRM, otXMMRM16, otXMMRM8, otYMMReg, otYMMRM, otZMMReg, otZMMRM, otEAX, otRAX, otMem32,
  22. otMem8, otMem16, otMem64, otMem128, otMem256, otMem512, otREG64, otREG32, otREG16, otREG8, otRM32, otRM64, otIMM8,
  23. otXMEM32, otXMEM64, otYMEM32, otYMEM64, otZMEM32, otZMEM64,
  24. otB32, otB64, otKREG);
  25. TOperandListItem = class(TObject)
  26. private
  27. FOpActive: boolean;
  28. FOpNumber: integer;
  29. FOpTyp: TOpType;
  30. FValues: TStringList;
  31. public
  32. constructor Create;
  33. destructor Destroy; override;
  34. property OpNumber: integer read FOpNumber write FOpNumber;
  35. property OpTyp: TOpType read FOpTyp write FOpTyp;
  36. property OpActive: boolean read FOpActive write FOpActive;
  37. property Values: TStringList read FValues;
  38. end;
  39. TOperandList = class(TBaseList)
  40. private
  41. function GetItems(aIndex: integer): TOperandListItem;
  42. public
  43. function Add(aItem: TOperandListItem): integer;
  44. property Items[aIndex: integer]: TOperandListItem read GetItems;
  45. end;
  46. { TAsmTestGenerator }
  47. TAsmTestGenerator = class(TObject)
  48. private
  49. FReg8 : TStringList;
  50. FReg16 : TStringList;
  51. FReg32Base : TStringList;
  52. FReg32Index : TStringList;
  53. FReg64Base : TStringList;
  54. FReg64Index : TStringList;
  55. FReg6432Base : TStringList;
  56. FReg6432Index : TStringList;
  57. FReg32XMMIndex : TStringList;
  58. FReg32YMMIndex : TStringList;
  59. FReg32ZMMIndex : TStringList;
  60. FReg64XMMIndex : TStringList;
  61. FReg64YMMIndex : TStringList;
  62. FReg64ZMMIndex : TStringList;
  63. FRegKREG : TStringList;
  64. Fx64: boolean;
  65. FAVX512: boolean;
  66. FSAE: boolean;
  67. procedure MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
  68. procedure VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
  69. function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
  70. function InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
  71. public
  72. constructor Create;
  73. destructor Destroy; override;
  74. class procedure CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  75. class procedure CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  76. class procedure CalcTestInstFile;
  77. property x64: boolean read Fx64;
  78. end;
  79. implementation
  80. uses SysUtils, Dialogs;
  81. const
  82. instabentries = {$i ../../../compiler/x86_64/x8664nop.inc}
  83. type
  84. TAsmOp={$i ../../../compiler/x86_64/x8664op.inc}
  85. op2strtable=array[tasmop] of string[16];
  86. {Instruction flags }
  87. tinsflag = (
  88. { please keep these in order and in sync with IF_SMASK }
  89. IF_SM, { size match first two operands }
  90. IF_SM2,
  91. IF_SB, { unsized operands can't be non-byte }
  92. IF_SW, { unsized operands can't be non-word }
  93. IF_SD, { unsized operands can't be nondword }
  94. { unsized argument spec }
  95. { please keep these in order and in sync with IF_ARMASK }
  96. IF_AR0, { SB, SW, SD applies to argument 0 }
  97. IF_AR1, { SB, SW, SD applies to argument 1 }
  98. IF_AR2, { SB, SW, SD applies to argument 2 }
  99. IF_PRIV, { it's a privileged instruction }
  100. IF_SMM, { it's only valid in SMM }
  101. IF_PROT, { it's protected mode only }
  102. IF_NOX86_64, { removed instruction in x86_64 }
  103. IF_UNDOC, { it's an undocumented instruction }
  104. IF_FPU, { it's an FPU instruction }
  105. IF_MMX, { it's an MMX instruction }
  106. { it's a 3DNow! instruction }
  107. IF_3DNOW,
  108. { it's a SSE (KNI, MMX2) instruction }
  109. IF_SSE,
  110. { SSE2 instructions }
  111. IF_SSE2,
  112. { SSE3 instructions }
  113. IF_SSE3,
  114. { SSE64 instructions }
  115. IF_SSE64,
  116. { SVM instructions }
  117. IF_SVM,
  118. { SSE4 instructions }
  119. IF_SSE4,
  120. IF_SSSE3,
  121. IF_SSE41,
  122. IF_SSE42,
  123. IF_MOVBE,
  124. IF_CLMUL,
  125. IF_AVX,
  126. IF_AVX2,
  127. IF_AVX512,
  128. IF_BMI1,
  129. IF_BMI2,
  130. { Intel ADX (Multi-Precision Add-Carry Instruction Extensions) }
  131. IF_ADX,
  132. IF_16BITONLY,
  133. IF_FMA,
  134. IF_FMA4,
  135. IF_TSX,
  136. IF_RAND,
  137. IF_XSAVE,
  138. IF_PREFETCHWT1,
  139. { mask for processor level }
  140. { please keep these in order and in sync with IF_PLEVEL }
  141. IF_8086, { 8086 instruction }
  142. IF_186, { 186+ instruction }
  143. IF_286, { 286+ instruction }
  144. IF_386, { 386+ instruction }
  145. IF_486, { 486+ instruction }
  146. IF_PENT, { Pentium instruction }
  147. IF_P6, { P6 instruction }
  148. IF_KATMAI, { Katmai instructions }
  149. IF_WILLAMETTE, { Willamette instructions }
  150. IF_PRESCOTT, { Prescott instructions }
  151. IF_X86_64,
  152. IF_SANDYBRIDGE, { Sandybridge-specific instruction }
  153. IF_NEC, { NEC V20/V30 instruction }
  154. { the following are not strictly part of the processor level, because
  155. they are never used standalone, but always in combination with a
  156. separate processor level flag. Therefore, they use bits outside of
  157. IF_PLEVEL, otherwise they would mess up the processor level they're
  158. used in combination with.
  159. The following combinations are currently used:
  160. [IF_AMD, IF_P6],
  161. [IF_CYRIX, IF_486],
  162. [IF_CYRIX, IF_PENT],
  163. [IF_CYRIX, IF_P6] }
  164. IF_CYRIX, { Cyrix, Centaur or VIA-specific instruction }
  165. IF_AMD, { AMD-specific instruction }
  166. { added flags }
  167. IF_PRE, { it's a prefix instruction }
  168. IF_PASS2, { if the instruction can change in a second pass }
  169. IF_IMM4, { immediate operand is a nibble (must be in range [0..15]) }
  170. IF_IMM3, { immediate operand is a triad (must be in range [0..7]) }
  171. IF_BCST2,
  172. IF_BCST4,
  173. IF_BCST8,
  174. IF_BCST16,
  175. IF_T2, { disp8 - tuple - 2 }
  176. IF_T4, { disp8 - tuple - 4 }
  177. IF_T8, { disp8 - tuple - 8 }
  178. IF_T1S, { disp8 - tuple - 1 scalar }
  179. IF_T1S8,
  180. IF_T1S16,
  181. IF_T1F32,
  182. IF_T1F64,
  183. IF_TMDDUP,
  184. IF_TFV, { disp8 - tuple - full vector }
  185. IF_TFVM, { disp8 - tuple - full vector memory }
  186. IF_TQVM,
  187. IF_TMEM128,
  188. IF_THV,
  189. IF_THVM,
  190. IF_TOVM,
  191. IF_SCL32,
  192. IF_SCL64
  193. );
  194. tinsflags=set of tinsflag;
  195. tinsentry=packed record
  196. opcode : tasmop;
  197. ops : byte;
  198. //optypes : array[0..max_operands-1] of longint;
  199. optypes : array[0..3] of int64; //TG
  200. code : array[0..11] of char;
  201. flags : tinsflags;
  202. end;
  203. pinsentry=^tinsentry;
  204. const
  205. OT_NONE = $00000000;
  206. { Bits 0..7: sizes }
  207. OT_BITS8 = $00000001;
  208. OT_BITS16 = $00000002;
  209. OT_BITS32 = $00000004;
  210. OT_BITS64 = $00000008; { x86_64 and FPU }
  211. //OT_BITS128 = $10000000; { 16 byte SSE }
  212. //OT_BITS256 = $20000000; { 32 byte AVX }
  213. //OT_BITS512 = $40000000; { 64 byte AVX512 }
  214. OT_BITS128 = $20000000; { 16 byte SSE }
  215. OT_BITS256 = $40000000; { 32 byte AVX }
  216. OT_BITS512 = $80000000; { 64 byte AVX512 }
  217. OT_VECTORMASK = $1000000000; { OPTIONAL VECTORMASK AVX512}
  218. OT_VECTORZERO = $2000000000; { OPTIONAL ZERO-FLAG AVX512}
  219. OT_VECTORBCST = $4000000000; { BROADCAST-MEM-FLAG AVX512}
  220. OT_VECTORSAE = $8000000000; { OPTIONAL SAE-FLAG AVX512}
  221. OT_VECTORER = $10000000000; { OPTIONAL ER-FLAG-FLAG AVX512}
  222. OT_BITSB32 = OT_BITS32 or OT_VECTORBCST;
  223. OT_BITSB64 = OT_BITS64 or OT_VECTORBCST;
  224. OT_VECTOR_EXT_MASK = OT_VECTORMASK or OT_VECTORZERO or OT_VECTORBCST;
  225. OT_BITS80 = $00000010; { FPU only }
  226. OT_FAR = $00000020; { this means 16:16 or 16:32, like in CALL/JMP }
  227. OT_NEAR = $00000040;
  228. OT_SHORT = $00000080;
  229. { TODO: FAR/NEAR/SHORT are sizes too, they should be included into size mask,
  230. but this requires adjusting the opcode table }
  231. //OT_SIZE_MASK = $3000001F; { all the size attributes }
  232. OT_SIZE_MASK = $E000001F; { all the size attributes }
  233. OT_NON_SIZE = int64(not int64(OT_SIZE_MASK));
  234. { Bits 8..11: modifiers }
  235. OT_SIGNED = $00000100; { the operand need to be signed -128-127 }
  236. OT_TO = $00000200; { reverse effect in FADD, FSUB &c }
  237. OT_COLON = $00000400; { operand is followed by a colon }
  238. OT_MODIFIER_MASK = $00000F00;
  239. { Bits 12..15: type of operand }
  240. OT_REGISTER = $00001000;
  241. OT_IMMEDIATE = $00002000;
  242. OT_MEMORY = $0000C000; { always includes 'OT_REGMEM' bit as well }
  243. OT_REGMEM = $00008000; { for r/m, ie EA, operands }
  244. OT_TYPE_MASK = OT_REGISTER or OT_IMMEDIATE or OT_MEMORY or OT_REGMEM;
  245. OT_REGNORM = OT_REGISTER or OT_REGMEM; { 'normal' reg, qualifies as EA }
  246. { Bits 20..22, 24..26: register classes
  247. otf_* consts are not used alone, only to build other constants. }
  248. otf_reg_cdt = $00100000;
  249. otf_reg_gpr = $00200000;
  250. otf_reg_sreg = $00400000;
  251. otf_reg_k = $00800000;
  252. otf_reg_fpu = $01000000;
  253. otf_reg_mmx = $02000000;
  254. otf_reg_xmm = $04000000;
  255. otf_reg_ymm = $08000000;
  256. otf_reg_zmm = $10000000;
  257. otf_reg_extra_mask = $0F000000;
  258. { Bits 16..19: subclasses, meaning depends on classes field }
  259. otf_sub0 = $00010000;
  260. otf_sub1 = $00020000;
  261. otf_sub2 = $00040000;
  262. otf_sub3 = $00080000;
  263. OT_REG_SMASK = otf_sub0 or otf_sub1 or otf_sub2 or otf_sub3;
  264. //OT_REG_EXTRA_MASK = $0F000000;
  265. OT_REG_EXTRA_MASK = $1F000000;
  266. OT_REG_TYPMASK = otf_reg_cdt or otf_reg_gpr or otf_reg_sreg or otf_reg_k or otf_reg_extra_mask;
  267. { register class 0: CRx, DRx and TRx }
  268. OT_REG_CDT = OT_REGISTER or otf_reg_cdt or OT_BITS64;
  269. OT_REG_CREG = OT_REG_CDT or otf_sub0; { CRn }
  270. OT_REG_DREG = OT_REG_CDT or otf_sub1; { DRn }
  271. OT_REG_TREG = OT_REG_CDT or otf_sub2; { TRn }
  272. OT_REG_CR4 = OT_REG_CDT or otf_sub3; { CR4 (Pentium only) }
  273. { register class 1: general-purpose registers }
  274. OT_REG_GPR = OT_REGNORM or otf_reg_gpr;
  275. OT_RM_GPR = OT_REGMEM or otf_reg_gpr;
  276. OT_REG8 = OT_REG_GPR or OT_BITS8; { 8-bit GPR }
  277. OT_REG16 = OT_REG_GPR or OT_BITS16;
  278. OT_REG32 = OT_REG_GPR or OT_BITS32;
  279. OT_REG64 = OT_REG_GPR or OT_BITS64;
  280. { GPR subclass 0: accumulator: AL, AX, EAX or RAX }
  281. OT_REG_ACCUM = OT_REG_GPR or otf_sub0;
  282. OT_REG_AL = OT_REG_ACCUM or OT_BITS8;
  283. OT_REG_AX = OT_REG_ACCUM or OT_BITS16;
  284. OT_REG_EAX = OT_REG_ACCUM or OT_BITS32;
  285. OT_REG_RAX = OT_REG_ACCUM or OT_BITS64;
  286. { GPR subclass 1: counter: CL, CX, ECX or RCX }
  287. OT_REG_COUNT = OT_REG_GPR or otf_sub1;
  288. OT_REG_CL = OT_REG_COUNT or OT_BITS8;
  289. OT_REG_CX = OT_REG_COUNT or OT_BITS16;
  290. OT_REG_ECX = OT_REG_COUNT or OT_BITS32;
  291. OT_REG_RCX = OT_REG_COUNT or OT_BITS64;
  292. { GPR subclass 2: data register: DL, DX, EDX or RDX }
  293. OT_REG_DX = OT_REG_GPR or otf_sub2 or OT_BITS16;
  294. OT_REG_EDX = OT_REG_GPR or otf_sub2 or OT_BITS32;
  295. { register class 2: Segment registers }
  296. OT_REG_SREG = OT_REGISTER or otf_reg_sreg or OT_BITS16;
  297. OT_REG_CS = OT_REG_SREG or otf_sub0; { CS }
  298. OT_REG_DESS = OT_REG_SREG or otf_sub1; { DS, ES, SS (non-CS 86 registers) }
  299. OT_REG_FSGS = OT_REG_SREG or otf_sub2; { FS, GS (386 extended registers) }
  300. { register class 3: FPU registers }
  301. OT_FPUREG = OT_REGISTER or otf_reg_fpu;
  302. OT_FPU0 = OT_FPUREG or otf_sub0; { FPU stack register zero }
  303. { register class 4: MMX (both reg and r/m) }
  304. OT_MMXREG = OT_REGNORM or otf_reg_mmx;
  305. OT_MMXRM = OT_REGMEM or otf_reg_mmx;
  306. { register class 5: XMM (both reg and r/m) }
  307. OT_XMMREG = OT_REGNORM or otf_reg_xmm;
  308. OT_XMMRM = OT_REGMEM or otf_reg_xmm;
  309. OT_XMEM32 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS32;
  310. OT_XMEM32_M = OT_XMEM32 or OT_VECTORMASK;
  311. OT_XMEM64 = OT_REGNORM or otf_reg_xmm or otf_reg_gpr or OT_BITS64;
  312. OT_XMEM64_M = OT_XMEM64 or OT_VECTORMASK;
  313. OT_XMMREG_M = OT_XMMREG or OT_VECTORMASK;
  314. OT_XMMREG_MZ = OT_XMMREG or OT_VECTORMASK or OT_VECTORZERO;
  315. OT_XMMRM_MZ = OT_XMMRM or OT_VECTORMASK or OT_VECTORZERO;
  316. OT_XMMREG_SAE = OT_XMMREG or OT_VECTORSAE;
  317. OT_XMMRM_SAE = OT_XMMRM or OT_VECTORSAE;
  318. OT_XMMREG_ER = OT_XMMREG or OT_VECTORER;
  319. OT_XMMRM_ER = OT_XMMRM or OT_VECTORER;
  320. { register class 5: YMM (both reg and r/m) }
  321. OT_YMMREG = OT_REGNORM or otf_reg_ymm;
  322. OT_YMMRM = OT_REGMEM or otf_reg_ymm;
  323. OT_YMEM32 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS32;
  324. OT_YMEM32_M = OT_YMEM32 or OT_VECTORMASK;
  325. OT_YMEM64 = OT_REGNORM or otf_reg_ymm or otf_reg_gpr or OT_BITS64;
  326. OT_YMEM64_M = OT_YMEM64 or OT_VECTORMASK;
  327. OT_YMMREG_M = OT_YMMREG or OT_VECTORMASK;
  328. OT_YMMREG_MZ = OT_YMMREG or OT_VECTORMASK or OT_VECTORZERO;
  329. OT_YMMRM_MZ = OT_YMMRM or OT_VECTORMASK or OT_VECTORZERO;
  330. OT_YMMREG_SAE = OT_YMMREG or OT_VECTORSAE;
  331. OT_YMMRM_SAE = OT_YMMRM or OT_VECTORSAE;
  332. OT_YMMREG_ER = OT_YMMREG or OT_VECTORER;
  333. OT_YMMRM_ER = OT_YMMRM or OT_VECTORER;
  334. { register class 5: ZMM (both reg and r/m) }
  335. OT_ZMMREG = OT_REGNORM or otf_reg_zmm;
  336. OT_ZMMRM = OT_REGMEM or otf_reg_zmm;
  337. OT_ZMEM32 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS32;
  338. OT_ZMEM32_M = OT_ZMEM32 or OT_VECTORMASK;
  339. OT_ZMEM64 = OT_REGNORM or otf_reg_zmm or otf_reg_gpr or OT_BITS64;
  340. OT_ZMEM64_M = OT_ZMEM64 or OT_VECTORMASK;
  341. OT_ZMMREG_M = OT_ZMMREG or OT_VECTORMASK;
  342. OT_ZMMREG_MZ = OT_ZMMREG or OT_VECTORMASK or OT_VECTORZERO;
  343. OT_ZMMRM_MZ = OT_ZMMRM or OT_VECTORMASK or OT_VECTORZERO;
  344. OT_ZMMREG_SAE = OT_ZMMREG or OT_VECTORSAE;
  345. OT_ZMMRM_SAE = OT_ZMMRM or OT_VECTORSAE;
  346. OT_ZMMREG_ER = OT_ZMMREG or OT_VECTORER;
  347. OT_ZMMRM_ER = OT_ZMMRM or OT_VECTORER;
  348. OT_KREG = OT_REGNORM or otf_reg_k;
  349. OT_KREG_M = OT_KREG or OT_VECTORMASK;
  350. { Vector-Memory operands }
  351. OT_VMEM_ANY = OT_XMEM32 or OT_XMEM64 or OT_YMEM32 or OT_YMEM64 or OT_ZMEM32 or OT_ZMEM64;
  352. { Memory operands }
  353. OT_MEM8 = OT_MEMORY or OT_BITS8;
  354. OT_MEM16 = OT_MEMORY or OT_BITS16;
  355. OT_MEM16_M = OT_MEM16 or OT_VECTORMASK;
  356. OT_MEM32 = OT_MEMORY or OT_BITS32;
  357. OT_MEM32_M = OT_MEMORY or OT_BITS32 or OT_VECTORMASK;
  358. OT_BMEM32 = OT_MEMORY or OT_BITS32 or OT_VECTORBCST;
  359. OT_BMEM32_SAE= OT_MEMORY or OT_BITS32 or OT_VECTORBCST or OT_VECTORSAE;
  360. OT_MEM64 = OT_MEMORY or OT_BITS64;
  361. OT_MEM64_M = OT_MEMORY or OT_BITS64 or OT_VECTORMASK;
  362. OT_BMEM64 = OT_MEMORY or OT_BITS64 or OT_VECTORBCST;
  363. OT_BMEM64_SAE= OT_MEMORY or OT_BITS64 or OT_VECTORBCST or OT_VECTORSAE;
  364. OT_MEM128 = OT_MEMORY or OT_BITS128;
  365. OT_MEM128_M = OT_MEMORY or OT_BITS128 or OT_VECTORMASK;
  366. OT_MEM256 = OT_MEMORY or OT_BITS256;
  367. OT_MEM256_M = OT_MEMORY or OT_BITS256 or OT_VECTORMASK;
  368. OT_MEM512 = OT_MEMORY or OT_BITS512;
  369. OT_MEM512_M = OT_MEMORY or OT_BITS512 or OT_VECTORMASK;
  370. OT_MEM80 = OT_MEMORY or OT_BITS80;
  371. OT_MEM_OFFS = OT_MEMORY or otf_sub0; { special type of EA }
  372. { simple [address] offset }
  373. { Matches any type of r/m operand }
  374. 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;
  375. { Immediate operands }
  376. OT_IMM8 = OT_IMMEDIATE or OT_BITS8;
  377. OT_IMM16 = OT_IMMEDIATE or OT_BITS16;
  378. OT_IMM32 = OT_IMMEDIATE or OT_BITS32;
  379. OT_IMM64 = OT_IMMEDIATE or OT_BITS64;
  380. OT_ONENESS = otf_sub0; { special type of immediate operand }
  381. OT_UNITY = OT_IMMEDIATE or OT_ONENESS; { for shift/rotate instructions }
  382. std_op2str:op2strtable={$i ../../../compiler/x86_64/x8664int.inc}
  383. InsTab:array[0..instabentries-1] of TInsEntry={$i ../../../compiler/x86_64/x8664tab.inc}
  384. { TOperandListItem }
  385. constructor TOperandListItem.Create;
  386. begin
  387. inherited;
  388. FOpActive := false;
  389. FOpNumber := -1;
  390. FOpTyp := otUnknown;
  391. FValues := TStringList.Create;
  392. end;
  393. destructor TOperandListItem.Destroy;
  394. begin
  395. FreeAndNil(FValues);
  396. inherited;
  397. end;
  398. { TOperandList }
  399. function TOperandList.Add(aItem: TOperandListItem): integer;
  400. begin
  401. result := FList.Add(aItem);
  402. end;
  403. function TOperandList.GetItems(aIndex: integer): TOperandListItem;
  404. begin
  405. result := TOperandListItem(FList[aIndex]);
  406. end;
  407. { TAsmTestGenerator }
  408. function TAsmTestGenerator.InternalCalcTestData(const aInst, aOp1, aOp2, aOp3,
  409. aOp4: String): TStringList;
  410. var
  411. i: integer;
  412. Item: TOperandListItem;
  413. OItem1: TOperandListItem;
  414. OItem2: TOperandListItem;
  415. OItem3: TOperandListItem;
  416. OItem4: TOperandListItem;
  417. il_Op: integer;
  418. il_Op1: integer;
  419. il_Op2: integer;
  420. il_Op3: integer;
  421. il_Op4: integer;
  422. sSuffix: string;
  423. sl_Operand: String;
  424. sl_Inst : String;
  425. sl_RegCombi: String;
  426. sl_Prefix: String;
  427. UsePrefix: boolean;
  428. il_Operands: integer;
  429. UsedParams: cardinal;
  430. UseDefault: boolean;
  431. sl_RegCombi1: string;
  432. sl_RegCombi2: string;
  433. sl_RegCombi3: string;
  434. function PrepareOperandTyp(const aTyp: String): String;
  435. begin
  436. result := aTyp;
  437. if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
  438. if result = 'XMMRM128' then result := 'XMMRM';
  439. if result = 'YMMRM256' then result := 'YMMRM';
  440. end;
  441. begin
  442. result := TStringList.Create;
  443. OItem1 := TOperandListItem.Create;
  444. try
  445. OItem2 := TOperandListItem.Create;
  446. try
  447. OItem3 := TOperandListItem.Create;
  448. try
  449. OItem4 := TOperandListItem.Create;
  450. try
  451. UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
  452. (UpperCase(aInst) = 'VCVTPD2PS') OR
  453. (UpperCase(aInst) = 'VCVTSI2SD') OR
  454. (UpperCase(aInst) = 'VCVTSI2SS') OR
  455. (UpperCase(aInst) = 'VCVTTPD2DQ') or
  456. (UpperCase(aInst) = 'VPMOVZXWQ') or
  457. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  458. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  459. (UpperCase(aInst) = 'VCVTTPD2UDQ') or
  460. (UpperCase(aInst) = 'VCVTUQQ2PS') or
  461. (UpperCase(aInst) = 'VCVTQQ2PS') or
  462. (UpperCase(aInst) = 'VCVTUSI2SD') or
  463. (UpperCase(aInst) = 'VCVTUSI2SS') or
  464. (UpperCase(aInst) = 'VFPCLASSPD') or
  465. (UpperCase(aInst) = 'VFPCLASSPS') or
  466. (UpperCase(aInst) = 'VCMPSS')
  467. ;
  468. for il_Op := 1 to 4 do
  469. begin
  470. sl_Prefix := '';
  471. case il_Op of
  472. 1: begin
  473. Item := OItem1;
  474. sl_Operand := aOp1;
  475. end;
  476. 2: begin
  477. Item := OItem2;
  478. sl_Operand := aOp2;
  479. end;
  480. 3: begin
  481. Item := OItem3;
  482. sl_Operand := aOp3;
  483. end;
  484. 4: begin
  485. Item := OItem4;
  486. sl_Operand := aOp4;
  487. end;
  488. end;
  489. sl_Operand := PrepareOperandTyp(sl_Operand);
  490. if (AnsiSameText(sl_Operand, 'XMMREG')) or
  491. (AnsiSameText(sl_Operand, 'XMMREG_M')) or
  492. (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
  493. (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
  494. (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
  495. begin
  496. Item.OpNumber := il_Op;
  497. Item.OpTyp := otXMMReg;
  498. Item.OpActive := true;
  499. sSuffix := '';
  500. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  501. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  502. if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}'
  503. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  504. Item.Values.Add('XMM0' + sSuffix);
  505. Item.Values.Add('XMM1' + sSuffix);
  506. Item.Values.Add('XMM2' + sSuffix);
  507. Item.Values.Add('XMM3' + sSuffix);
  508. Item.Values.Add('XMM4' + sSuffix);
  509. Item.Values.Add('XMM5' + sSuffix);
  510. Item.Values.Add('XMM6' + sSuffix);
  511. Item.Values.Add('XMM7' + sSuffix);
  512. if x64 then
  513. begin
  514. Item.Values.Clear;
  515. if FAVX512 then
  516. begin
  517. Item.Values.Add('XMM0' + sSuffix);
  518. Item.Values.Add('XMM9' + sSuffix);
  519. Item.Values.Add('XMM18' + sSuffix);
  520. Item.Values.Add('XMM27' + sSuffix);
  521. Item.Values.Add('XMM31' + sSuffix);
  522. if sSuffix <> '' then
  523. begin
  524. Item.Values.Add('XMM0');
  525. Item.Values.Add('XMM9');
  526. Item.Values.Add('XMM18');
  527. Item.Values.Add('XMM27');
  528. Item.Values.Add('XMM31');
  529. end;
  530. end
  531. else
  532. begin
  533. Item.Values.Add('XMM0' + sSuffix);
  534. Item.Values.Add('XMM4' + sSuffix);
  535. Item.Values.Add('XMM8' + sSuffix);
  536. Item.Values.Add('XMM12' + sSuffix);
  537. Item.Values.Add('XMM15' + sSuffix);
  538. if sSuffix <> '' then
  539. begin
  540. Item.Values.Add('XMM0');
  541. Item.Values.Add('XMM4');
  542. Item.Values.Add('XMM8');
  543. Item.Values.Add('XMM12');
  544. Item.Values.Add('XMM15');
  545. end;
  546. end;
  547. end;
  548. end
  549. else if (AnsiSameText(sl_Operand, 'XMMRM')) or
  550. (AnsiSameText(sl_Operand, 'XMMRM_M')) or
  551. (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
  552. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  553. (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
  554. begin
  555. Item.OpNumber := il_Op;
  556. Item.OpTyp := otXMMRM;
  557. Item.OpActive := true;
  558. if UsePrefix then sl_Prefix := 'oword ';
  559. sSuffix := '';
  560. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  561. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  562. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  563. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  564. Item.Values.Add('XMM0' + sSuffix);
  565. Item.Values.Add('XMM1' + sSuffix);
  566. Item.Values.Add('XMM2' + sSuffix);
  567. Item.Values.Add('XMM3' + sSuffix);
  568. Item.Values.Add('XMM4' + sSuffix);
  569. Item.Values.Add('XMM5' + sSuffix);
  570. Item.Values.Add('XMM6' + sSuffix);
  571. Item.Values.Add('XMM7' + sSuffix);
  572. if x64 then
  573. begin
  574. Item.Values.Clear;
  575. if FAVX512 then
  576. begin
  577. Item.Values.Add('XMM0' + sSuffix);
  578. Item.Values.Add('XMM0');
  579. Item.Values.Add('XMM9' + sSuffix);
  580. Item.Values.Add('XMM9');
  581. Item.Values.Add('XMM18' + sSuffix);
  582. Item.Values.Add('XMM18');
  583. Item.Values.Add('XMM27' + sSuffix);
  584. Item.Values.Add('XMM27');
  585. Item.Values.Add('XMM31' + sSuffix);
  586. Item.Values.Add('XMM31');
  587. end
  588. else
  589. begin
  590. Item.Values.Add('XMM0' + sSuffix);
  591. Item.Values.Add('XMM0');
  592. Item.Values.Add('XMM4' + sSuffix);
  593. Item.Values.Add('XMM4');
  594. Item.Values.Add('XMM8' + sSuffix);
  595. Item.Values.Add('XMM8');
  596. Item.Values.Add('XMM12' + sSuffix);
  597. Item.Values.Add('XMM15');
  598. Item.Values.Add('XMM15' + sSuffix);
  599. end;
  600. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  601. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  602. end
  603. else
  604. begin
  605. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  606. end;
  607. end
  608. else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
  609. (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
  610. (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
  611. (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
  612. (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
  613. begin
  614. Item.OpNumber := il_Op;
  615. Item.OpTyp := otXMMRM8;
  616. Item.OpActive := true;
  617. if UsePrefix then sl_Prefix := 'byte ';
  618. sSuffix := '';
  619. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  620. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  621. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  622. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  623. Item.Values.Add('XMM0' + sSuffix);
  624. Item.Values.Add('XMM1' + sSuffix);
  625. Item.Values.Add('XMM2' + sSuffix);
  626. Item.Values.Add('XMM3' + sSuffix);
  627. Item.Values.Add('XMM4' + sSuffix);
  628. Item.Values.Add('XMM5' + sSuffix);
  629. Item.Values.Add('XMM6' + sSuffix);
  630. Item.Values.Add('XMM7' + sSuffix);
  631. if x64 then
  632. begin
  633. Item.Values.Clear;
  634. if FAVX512 then
  635. begin
  636. Item.Values.Add('XMM0' + sSuffix);
  637. Item.Values.Add('XMM0');
  638. Item.Values.Add('XMM9' + sSuffix);
  639. Item.Values.Add('XMM9');
  640. Item.Values.Add('XMM18' + sSuffix);
  641. Item.Values.Add('XMM18');
  642. Item.Values.Add('XMM27' + sSuffix);
  643. Item.Values.Add('XMM27');
  644. Item.Values.Add('XMM31' + sSuffix);
  645. Item.Values.Add('XMM31');
  646. end
  647. else
  648. begin
  649. Item.Values.Add('XMM0' + sSuffix);
  650. Item.Values.Add('XMM0');
  651. Item.Values.Add('XMM4' + sSuffix);
  652. Item.Values.Add('XMM4');
  653. Item.Values.Add('XMM8' + sSuffix);
  654. Item.Values.Add('XMM8');
  655. Item.Values.Add('XMM12' + sSuffix);
  656. Item.Values.Add('XMM12');
  657. Item.Values.Add('XMM15' + sSuffix);
  658. Item.Values.Add('XMM15');
  659. end;
  660. //Item.Values.Add('[RIP]');
  661. //Item.Values.Add('[RIP + 16]');
  662. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  663. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  664. end
  665. else
  666. begin
  667. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  668. end;
  669. end
  670. else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
  671. (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
  672. (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
  673. (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
  674. (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
  675. then
  676. begin
  677. Item.OpNumber := il_Op;
  678. Item.OpTyp := otXMMRM16;
  679. Item.OpActive := true;
  680. if UsePrefix then sl_Prefix := 'word ';
  681. sSuffix := '';
  682. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  683. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  684. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  685. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  686. Item.Values.Add('XMM0' + sSuffix);
  687. Item.Values.Add('XMM1' + sSuffix);
  688. Item.Values.Add('XMM2' + sSuffix);
  689. Item.Values.Add('XMM3' + sSuffix);
  690. Item.Values.Add('XMM4' + sSuffix);
  691. Item.Values.Add('XMM5' + sSuffix);
  692. Item.Values.Add('XMM6' + sSuffix);
  693. Item.Values.Add('XMM7' + sSuffix);
  694. if x64 then
  695. begin
  696. Item.Values.Clear;
  697. if FAVX512 then
  698. begin
  699. Item.Values.Add('XMM0' + sSuffix);
  700. Item.Values.Add('XMM0');
  701. Item.Values.Add('XMM9' + sSuffix);
  702. Item.Values.Add('XMM9');
  703. Item.Values.Add('XMM18' + sSuffix);
  704. Item.Values.Add('XMM18');
  705. Item.Values.Add('XMM27' + sSuffix);
  706. Item.Values.Add('XMM27');
  707. Item.Values.Add('XMM31' + sSuffix);
  708. Item.Values.Add('XMM31');
  709. end
  710. else
  711. begin
  712. Item.Values.Add('XMM0' + sSuffix);
  713. Item.Values.Add('XMM0');
  714. Item.Values.Add('XMM4' + sSuffix);
  715. Item.Values.Add('XMM4');
  716. Item.Values.Add('XMM8' + sSuffix);
  717. Item.Values.Add('XMM8');
  718. Item.Values.Add('XMM12' + sSuffix);
  719. Item.Values.Add('XMM12');
  720. Item.Values.Add('XMM15' + sSuffix);
  721. Item.Values.Add('XMM15');
  722. end;
  723. //Item.Values.Add('[RIP]');
  724. //Item.Values.Add('[RIP + 16]');
  725. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  726. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  727. end
  728. else
  729. begin
  730. MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  731. end;
  732. end
  733. else if (AnsiSameText(sl_Operand, 'YMMREG')) or
  734. (AnsiSameText(sl_Operand, 'YMMREG_M')) or
  735. (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
  736. (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
  737. (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
  738. then
  739. begin
  740. Item.OpNumber := il_Op;
  741. Item.OpTyp := otYMMReg;
  742. Item.OpActive := true;
  743. sSuffix := '';
  744. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  745. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  746. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  747. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  748. Item.Values.Add('YMM0' + sSuffix);
  749. Item.Values.Add('YMM1' + sSuffix);
  750. Item.Values.Add('YMM2' + sSuffix);
  751. Item.Values.Add('YMM3' + sSuffix);
  752. Item.Values.Add('YMM4' + sSuffix);
  753. Item.Values.Add('YMM5' + sSuffix);
  754. Item.Values.Add('YMM6' + sSuffix);
  755. Item.Values.Add('YMM7' + sSuffix);
  756. if x64 then
  757. begin
  758. Item.Values.Clear;
  759. if FAVX512 then
  760. begin
  761. Item.Values.Add('YMM0' + sSuffix);
  762. Item.Values.Add('YMM9' + sSuffix);
  763. Item.Values.Add('YMM18' + sSuffix);
  764. Item.Values.Add('YMM27' + sSuffix);
  765. Item.Values.Add('YMM31' + sSuffix);
  766. if sSuffix <> '' then
  767. begin
  768. Item.Values.Add('YMM0');
  769. Item.Values.Add('YMM9');
  770. Item.Values.Add('YMM18');
  771. Item.Values.Add('YMM27');
  772. Item.Values.Add('YMM31');
  773. end;
  774. end
  775. else
  776. begin
  777. Item.Values.Add('YMM0' + sSuffix);
  778. Item.Values.Add('YMM4' + sSuffix);
  779. Item.Values.Add('YMM8' + sSuffix);
  780. Item.Values.Add('YMM12' + sSuffix);
  781. Item.Values.Add('YMM15' + sSuffix);
  782. if sSuffix <> '' then
  783. begin
  784. Item.Values.Add('YMM0');
  785. Item.Values.Add('YMM4');
  786. Item.Values.Add('YMM8');
  787. Item.Values.Add('YMM12');
  788. Item.Values.Add('YMM15');
  789. end;
  790. end;
  791. end;
  792. end
  793. else if (AnsiSameText(sl_Operand, 'YMMRM')) or
  794. (AnsiSameText(sl_Operand, 'YMMRM_M')) or
  795. (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
  796. (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
  797. (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
  798. then
  799. begin
  800. Item.OpNumber := il_Op;
  801. Item.OpTyp := otYMMRM;
  802. Item.OpActive := true;
  803. if UsePrefix then sl_Prefix := 'yword ';
  804. sSuffix := '';
  805. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  806. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  807. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  808. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  809. Item.Values.Add('YMM0' + sSuffix);
  810. Item.Values.Add('YMM1' + sSuffix);
  811. Item.Values.Add('YMM2' + sSuffix);
  812. Item.Values.Add('YMM3' + sSuffix);
  813. Item.Values.Add('YMM4' + sSuffix);
  814. Item.Values.Add('YMM5' + sSuffix);
  815. Item.Values.Add('YMM6' + sSuffix);
  816. Item.Values.Add('YMM7' + sSuffix);
  817. if x64 then
  818. begin
  819. Item.Values.Clear;
  820. if FAVX512 then
  821. begin
  822. Item.Values.Add('YMM0' + sSuffix);
  823. Item.Values.Add('YMM9' + sSuffix);
  824. Item.Values.Add('YMM18' + sSuffix);
  825. Item.Values.Add('YMM27' + sSuffix);
  826. Item.Values.Add('YMM31' + sSuffix);
  827. if sSuffix <> '' then
  828. begin
  829. Item.Values.Add('YMM0');
  830. Item.Values.Add('YMM9');
  831. Item.Values.Add('YMM18');
  832. Item.Values.Add('YMM27');
  833. Item.Values.Add('YMM31');
  834. end;
  835. end
  836. else
  837. begin
  838. Item.Values.Add('YMM0' + sSuffix);
  839. Item.Values.Add('YMM4' + sSuffix);
  840. Item.Values.Add('YMM8' + sSuffix);
  841. Item.Values.Add('YMM12' + sSuffix);
  842. Item.Values.Add('YMM15' + sSuffix);
  843. if sSuffix <> '' then
  844. begin
  845. Item.Values.Add('YMM0');
  846. Item.Values.Add('YMM4');
  847. Item.Values.Add('YMM8');
  848. Item.Values.Add('YMM12');
  849. Item.Values.Add('YMM15');
  850. end;
  851. end;
  852. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  853. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  854. end
  855. else
  856. begin
  857. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  858. end;
  859. end
  860. else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
  861. (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
  862. (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
  863. (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
  864. (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
  865. then
  866. begin
  867. Item.OpNumber := il_Op;
  868. Item.OpTyp := otZMMReg;
  869. Item.OpActive := true;
  870. sSuffix := '';
  871. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  872. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  873. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  874. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  875. Item.Values.Add('ZMM0' + sSuffix);
  876. Item.Values.Add('ZMM1' + sSuffix);
  877. Item.Values.Add('ZMM2' + sSuffix);
  878. Item.Values.Add('ZMM3' + sSuffix);
  879. Item.Values.Add('ZMM4' + sSuffix);
  880. Item.Values.Add('ZMM5' + sSuffix);
  881. Item.Values.Add('ZMM6' + sSuffix);
  882. Item.Values.Add('ZMM7' + sSuffix);
  883. if x64 then
  884. begin
  885. Item.Values.Clear;
  886. if FAVX512 then
  887. begin
  888. Item.Values.Add('ZMM0' + sSuffix);
  889. Item.Values.Add('ZMM9' + sSuffix);
  890. Item.Values.Add('ZMM18' + sSuffix);
  891. Item.Values.Add('ZMM27' + sSuffix);
  892. Item.Values.Add('ZMM31' + sSuffix);
  893. if sSuffix <> '' then
  894. begin
  895. Item.Values.Add('ZMM0');
  896. Item.Values.Add('ZMM9');
  897. Item.Values.Add('ZMM18');
  898. Item.Values.Add('ZMM27');
  899. Item.Values.Add('ZMM31');
  900. end;
  901. end
  902. else
  903. begin
  904. Item.Values.Add('ZMM0' + sSuffix);
  905. Item.Values.Add('ZMM4' + sSuffix);
  906. Item.Values.Add('ZMM8' + sSuffix);
  907. Item.Values.Add('ZMM12' + sSuffix);
  908. Item.Values.Add('ZMM15' + sSuffix);
  909. end;
  910. end;
  911. end
  912. else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
  913. (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
  914. (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
  915. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  916. (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
  917. then
  918. begin
  919. Item.OpNumber := il_Op;
  920. Item.OpTyp := otZMMRM;
  921. Item.OpActive := true;
  922. if UsePrefix then sl_Prefix := 'zword ';
  923. sSuffix := '';
  924. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'
  925. else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  926. if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
  927. else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
  928. Item.Values.Add('ZMM0' + sSuffix);
  929. Item.Values.Add('ZMM1' + sSuffix);
  930. Item.Values.Add('ZMM2' + sSuffix);
  931. Item.Values.Add('ZMM3' + sSuffix);
  932. Item.Values.Add('ZMM4' + sSuffix);
  933. Item.Values.Add('ZMM5' + sSuffix);
  934. Item.Values.Add('ZMM6' + sSuffix);
  935. Item.Values.Add('ZMM7' + sSuffix);
  936. if x64 then
  937. begin
  938. Item.Values.Clear;
  939. if FAVX512 then
  940. begin
  941. Item.Values.Add('ZMM0' + sSuffix);
  942. Item.Values.Add('ZMM9' + sSuffix);
  943. Item.Values.Add('ZMM18' + sSuffix);
  944. Item.Values.Add('ZMM27' + sSuffix);
  945. Item.Values.Add('ZMM31' + sSuffix);
  946. if sSuffix <> '' then
  947. begin
  948. Item.Values.Add('ZMM0');
  949. Item.Values.Add('ZMM9');
  950. Item.Values.Add('ZMM18');
  951. Item.Values.Add('ZMM27');
  952. Item.Values.Add('ZMM31');
  953. end;
  954. end
  955. else
  956. begin
  957. Item.Values.Add('ZMM0' + sSuffix);
  958. Item.Values.Add('ZMM4' + sSuffix);
  959. Item.Values.Add('ZMM8' + sSuffix);
  960. Item.Values.Add('ZMM12' + sSuffix);
  961. Item.Values.Add('ZMM15' + sSuffix);
  962. end;
  963. MemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64Index, Item.Values);
  964. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  965. end
  966. else
  967. begin
  968. MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
  969. end;
  970. end
  971. else if AnsiSameText(sl_Operand, 'MEM8') then
  972. begin
  973. Item.OpNumber := il_Op;
  974. Item.OpTyp := otMEM8;
  975. Item.OpActive := true;
  976. if UsePrefix then sl_Prefix := 'byte ';
  977. sSuffix := '';
  978. if x64 then
  979. begin
  980. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  981. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  982. end
  983. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  984. end
  985. else if AnsiSameText(sl_Operand, 'MEM16') or
  986. AnsiSameText(sl_Operand, 'MEM16_M') then
  987. begin
  988. Item.OpNumber := il_Op;
  989. Item.OpTyp := otMEM16;
  990. Item.OpActive := true;
  991. if UsePrefix then sl_Prefix := 'word ';
  992. sSuffix := '';
  993. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  994. if x64 then
  995. begin
  996. MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  997. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  998. end
  999. else MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1000. end
  1001. else if AnsiSameText(sl_Operand, 'MEM32') or
  1002. AnsiSameText(sl_Operand, 'MEM32_M') or
  1003. AnsiSameText(sl_Operand, 'MEM32_MZ') then
  1004. begin
  1005. Item.OpNumber := il_Op;
  1006. Item.OpTyp := otMEM32;
  1007. Item.OpActive := true;
  1008. if UsePrefix then sl_Prefix := 'dword ';
  1009. sSuffix := '';
  1010. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1011. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1012. if x64 then
  1013. begin
  1014. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1015. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1016. end
  1017. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1018. end
  1019. else if (AnsiSameText(sl_Operand, 'MEM64')) or
  1020. (AnsiSameText(sl_Operand, 'MEM64_M')) or
  1021. (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
  1022. begin
  1023. Item.OpNumber := il_Op;
  1024. Item.OpTyp := otMEM64;
  1025. Item.OpActive := true;
  1026. if UsePrefix then sl_Prefix := 'qword ';
  1027. sSuffix := '';
  1028. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1029. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1030. if x64 then
  1031. begin
  1032. MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1033. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1034. end
  1035. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1036. end
  1037. else if (AnsiSameText(sl_Operand, 'MEM128')) or
  1038. (AnsiSameText(sl_Operand, 'MEM128_M')) or
  1039. (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
  1040. begin
  1041. Item.OpNumber := il_Op;
  1042. Item.OpTyp := otMEM128;
  1043. Item.OpActive := true;
  1044. if UsePrefix then sl_Prefix := 'oword ';
  1045. sSuffix := '';
  1046. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1047. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1048. if x64 then
  1049. begin
  1050. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1051. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1052. end
  1053. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1054. end
  1055. else if (AnsiSameText(sl_Operand, 'MEM256')) or
  1056. (AnsiSameText(sl_Operand, 'MEM256_M')) or
  1057. (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
  1058. begin
  1059. Item.OpNumber := il_Op;
  1060. Item.OpTyp := otMEM256;
  1061. Item.OpActive := true;
  1062. if UsePrefix then sl_Prefix := 'yword ';
  1063. sSuffix := '';
  1064. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1065. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1066. if x64 then
  1067. begin
  1068. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1069. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1070. end
  1071. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1072. end
  1073. else if (AnsiSameText(sl_Operand, 'MEM512')) or
  1074. (AnsiSameText(sl_Operand, 'MEM512_M')) or
  1075. (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
  1076. begin
  1077. Item.OpNumber := il_Op;
  1078. Item.OpTyp := otMEM512;
  1079. Item.OpActive := true;
  1080. if UsePrefix then sl_Prefix := 'zword ';
  1081. sSuffix := '';
  1082. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1083. if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}';
  1084. if x64 then
  1085. begin
  1086. MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
  1087. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1088. end
  1089. else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
  1090. end
  1091. else if AnsiSameText(sl_Operand, 'REG8') then
  1092. begin
  1093. Item.OpNumber := il_Op;
  1094. Item.OpTyp := otREG8;
  1095. Item.OpActive := true;
  1096. if x64 then
  1097. begin
  1098. Item.Values.AddStrings(FReg8);
  1099. end
  1100. else Item.Values.AddStrings(FReg8);
  1101. end
  1102. else if AnsiSameText(sl_Operand, 'REG16') then
  1103. begin
  1104. Item.OpNumber := il_Op;
  1105. Item.OpTyp := otREG16;
  1106. Item.OpActive := true;
  1107. if x64 then
  1108. begin
  1109. Item.Values.AddStrings(FReg16);
  1110. end
  1111. else Item.Values.AddStrings(FReg16);
  1112. end
  1113. else if AnsiSameText(sl_Operand, 'REG32') then
  1114. begin
  1115. Item.OpNumber := il_Op;
  1116. Item.OpTyp := otREG32;
  1117. Item.OpActive := true;
  1118. if x64 then
  1119. begin
  1120. Item.Values.AddStrings(FReg32Base);
  1121. end
  1122. else Item.Values.AddStrings(FReg32Base);
  1123. end
  1124. else if AnsiSameText(sl_Operand, 'REG64') then
  1125. begin
  1126. Item.OpNumber := il_Op;
  1127. Item.OpTyp := otREG64;
  1128. Item.OpActive := true;
  1129. if x64 then
  1130. begin
  1131. Item.Values.AddStrings(FReg64Base);
  1132. end;
  1133. end
  1134. else if AnsiSameText(sl_Operand, 'RM32') then
  1135. begin
  1136. Item.OpNumber := il_Op;
  1137. Item.OpTyp := otRM32;
  1138. Item.OpActive := true;
  1139. Item.Values.AddStrings(FReg32Base);
  1140. if UsePrefix then sl_Prefix := 'dword ';
  1141. if x64 then
  1142. begin
  1143. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1144. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1145. end
  1146. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1147. end
  1148. else if AnsiSameText(sl_Operand, 'RM64') then
  1149. begin
  1150. Item.OpNumber := il_Op;
  1151. Item.OpTyp := otRM32;
  1152. Item.OpActive := true;
  1153. if UsePrefix then sl_Prefix := 'qword ';
  1154. if x64 then
  1155. begin
  1156. Item.Values.AddStrings(FReg64Base);
  1157. MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
  1158. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1159. end
  1160. else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
  1161. end
  1162. else if AnsiSameText(sl_Operand, 'IMM8') then
  1163. begin
  1164. Item.OpNumber := il_Op;
  1165. Item.OpTyp := otIMM8;
  1166. Item.OpActive := true;
  1167. Item.Values.Add('0');
  1168. end
  1169. else if AnsiSameText(sl_Operand, 'XMEM32') or
  1170. AnsiSameText(sl_Operand, 'XMEM32_M') then
  1171. begin
  1172. Item.OpNumber := il_Op;
  1173. Item.OpTyp := otXMEM32;
  1174. Item.OpActive := true;
  1175. if UsePrefix then sl_Prefix := 'oword ';
  1176. sSuffix := '';
  1177. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1178. if x64 then
  1179. begin
  1180. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  1181. if sSuffix <> '' then
  1182. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  1183. end
  1184. else
  1185. begin
  1186. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  1187. if sSuffix <> '' then
  1188. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  1189. end;
  1190. end
  1191. else if AnsiSameText(sl_Operand, 'XMEM64') or
  1192. AnsiSameText(sl_Operand, 'XMEM64_M') then
  1193. begin
  1194. Item.OpNumber := il_Op;
  1195. Item.OpTyp := otXMEM64;
  1196. Item.OpActive := true;
  1197. //if UsePrefix then sl_Prefix := 'oword ';
  1198. //
  1199. //if x64 then
  1200. //begin
  1201. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
  1202. //end
  1203. //else
  1204. //begin
  1205. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
  1206. //end;
  1207. sSuffix := '';
  1208. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1209. if x64 then
  1210. begin
  1211. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values);
  1212. if sSuffix <> '' then
  1213. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values);
  1214. end
  1215. else
  1216. begin
  1217. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values);
  1218. if sSuffix <> '' then
  1219. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values);
  1220. end;
  1221. end
  1222. else if AnsiSameText(sl_Operand, 'YMEM32') or
  1223. AnsiSameText(sl_Operand, 'YMEM32_M') then
  1224. begin
  1225. Item.OpNumber := il_Op;
  1226. Item.OpTyp := otYMEM32;
  1227. Item.OpActive := true;
  1228. if UsePrefix then sl_Prefix := 'yword ';
  1229. //if x64 then
  1230. //begin
  1231. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  1232. //end
  1233. //else
  1234. //begin
  1235. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  1236. //end;
  1237. sSuffix := '';
  1238. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1239. if x64 then
  1240. begin
  1241. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  1242. if sSuffix <> '' then
  1243. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  1244. end
  1245. else
  1246. begin
  1247. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  1248. if sSuffix <> '' then
  1249. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  1250. end;
  1251. end
  1252. else if AnsiSameText(sl_Operand, 'YMEM64') or
  1253. AnsiSameText(sl_Operand, 'YMEM64_M') then
  1254. begin
  1255. Item.OpNumber := il_Op;
  1256. Item.OpTyp := otYMEM64;
  1257. Item.OpActive := true;
  1258. if UsePrefix then sl_Prefix := 'yword ';
  1259. //if x64 then
  1260. //begin
  1261. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
  1262. //end
  1263. //else
  1264. //begin
  1265. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
  1266. //end;
  1267. sSuffix := '';
  1268. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1269. if x64 then
  1270. begin
  1271. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values);
  1272. if sSuffix <> '' then
  1273. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values);
  1274. end
  1275. else
  1276. begin
  1277. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values);
  1278. if sSuffix <> '' then
  1279. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values);
  1280. end;
  1281. end
  1282. else if AnsiSameText(sl_Operand, 'ZMEM32') or
  1283. AnsiSameText(sl_Operand, 'ZMEM32_M') then
  1284. begin
  1285. Item.OpNumber := il_Op;
  1286. Item.OpTyp := otZMEM32;
  1287. Item.OpActive := true;
  1288. if UsePrefix then sl_Prefix := 'zword ';
  1289. //if x64 then
  1290. //begin
  1291. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1292. //end
  1293. //else
  1294. //begin
  1295. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1296. //end;
  1297. sSuffix := '';
  1298. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1299. if x64 then
  1300. begin
  1301. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1302. if sSuffix <> '' then
  1303. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  1304. end
  1305. else
  1306. begin
  1307. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1308. if sSuffix <> '' then
  1309. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  1310. end;
  1311. end
  1312. else if AnsiSameText(sl_Operand, 'ZMEM64') or
  1313. AnsiSameText(sl_Operand, 'ZMEM64_M') then
  1314. begin
  1315. Item.OpNumber := il_Op;
  1316. Item.OpTyp := otZMEM64;
  1317. Item.OpActive := true;
  1318. if UsePrefix then sl_Prefix := 'zword ';
  1319. //if x64 then
  1320. //begin
  1321. // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1322. //end
  1323. //else
  1324. //begin
  1325. // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1326. //end;
  1327. sSuffix := '';
  1328. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1329. if x64 then
  1330. begin
  1331. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values);
  1332. if sSuffix <> '' then
  1333. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values);
  1334. end
  1335. else
  1336. begin
  1337. VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values);
  1338. if sSuffix <> '' then
  1339. VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values);
  1340. end;
  1341. end
  1342. else if AnsiSameText(sl_Operand, '2B32') then
  1343. begin
  1344. Item.OpNumber := il_Op;
  1345. Item.OpTyp := otB32;
  1346. Item.OpActive := true;
  1347. if x64 then
  1348. begin
  1349. MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  1350. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1351. end
  1352. else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  1353. end
  1354. else if AnsiSameText(sl_Operand, '4B32') then
  1355. begin
  1356. Item.OpNumber := il_Op;
  1357. Item.OpTyp := otB32;
  1358. Item.OpActive := true;
  1359. if x64 then
  1360. begin
  1361. MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  1362. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1363. end
  1364. else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  1365. end
  1366. else if AnsiSameText(sl_Operand, '8B32') then
  1367. begin
  1368. Item.OpNumber := il_Op;
  1369. Item.OpTyp := otB32;
  1370. Item.OpActive := true;
  1371. if x64 then
  1372. begin
  1373. MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  1374. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1375. end
  1376. else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  1377. end
  1378. else if AnsiSameText(sl_Operand, '16B32') then
  1379. begin
  1380. Item.OpNumber := il_Op;
  1381. Item.OpTyp := otB32;
  1382. Item.OpActive := true;
  1383. if x64 then
  1384. begin
  1385. MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  1386. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1387. end
  1388. else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  1389. end
  1390. else if AnsiSameText(sl_Operand, '2B64') then
  1391. begin
  1392. Item.OpNumber := il_Op;
  1393. Item.OpTyp := otB64;
  1394. Item.OpActive := true;
  1395. if x64 then
  1396. begin
  1397. MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
  1398. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1399. end
  1400. else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
  1401. end
  1402. else if AnsiSameText(sl_Operand, '4B64') then
  1403. begin
  1404. Item.OpNumber := il_Op;
  1405. Item.OpTyp := otB64;
  1406. Item.OpActive := true;
  1407. if x64 then
  1408. begin
  1409. MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
  1410. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1411. end
  1412. else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
  1413. end
  1414. else if AnsiSameText(sl_Operand, '8B64') then
  1415. begin
  1416. Item.OpNumber := il_Op;
  1417. Item.OpTyp := otB64;
  1418. Item.OpActive := true;
  1419. if x64 then
  1420. begin
  1421. MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
  1422. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1423. end
  1424. else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
  1425. end
  1426. else if AnsiSameText(sl_Operand, '16B64') then
  1427. begin
  1428. Item.OpNumber := il_Op;
  1429. Item.OpTyp := otB64;
  1430. Item.OpActive := true;
  1431. if x64 then
  1432. begin
  1433. MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
  1434. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  1435. end
  1436. else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
  1437. end
  1438. else if AnsiSameText(sl_Operand, 'KREG') or
  1439. AnsiSameText(sl_Operand, 'KREG_M') then
  1440. begin
  1441. Item.OpNumber := il_Op;
  1442. Item.OpTyp := otKREG;
  1443. Item.OpActive := true;
  1444. sSuffix := '';
  1445. if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}';
  1446. if UsePrefix then sl_Prefix := '';
  1447. for i := 0 to FRegKREG.Count - 1 do
  1448. Item.Values.Add(FRegKREG[i] + sSuffix);
  1449. end
  1450. else if trim(sl_Operand) = '' then
  1451. begin
  1452. Item.OpNumber := il_Op;
  1453. Item.OpTyp := otUnknown;
  1454. Item.OpActive := false;
  1455. Item.Values.Add('');
  1456. end
  1457. else
  1458. begin
  1459. Item.OpNumber := il_Op;
  1460. Item.OpTyp := otUnknown;
  1461. Item.OpActive := false;
  1462. Item.Values.Add('?' + sl_Operand);
  1463. end
  1464. end;
  1465. sl_RegCombi := '';
  1466. il_Operands := 0;
  1467. UsedParams := 0;
  1468. if OItem1.OpActive then
  1469. begin
  1470. inc(il_Operands);
  1471. UsedParams := UsedParams or 1;
  1472. end;
  1473. if OItem2.OpActive then
  1474. begin
  1475. inc(il_Operands);
  1476. UsedParams := UsedParams or 2;
  1477. end;
  1478. if OItem3.OpActive then
  1479. begin
  1480. inc(il_Operands);
  1481. UsedParams := UsedParams or 4;
  1482. end;
  1483. if OItem4.OpActive then
  1484. begin
  1485. inc(il_Operands);
  1486. UsedParams := UsedParams or 8;
  1487. end;
  1488. case il_Operands of
  1489. 1: UseDefault := UsedParams <> 1;
  1490. 2: UseDefault := UsedParams <> 3;
  1491. 3: UseDefault := UsedParams <> 7;
  1492. 4: UseDefault := UsedParams <> 15;
  1493. else UseDefault := true;
  1494. end;
  1495. //UseDefault := true;
  1496. if UseDefault then
  1497. begin
  1498. sl_Inst := format('%-20s', [aInst]);
  1499. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  1500. begin
  1501. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  1502. begin
  1503. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  1504. begin
  1505. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  1506. begin
  1507. sl_RegCombi := '';
  1508. if OItem1.OpActive then
  1509. begin
  1510. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  1511. sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
  1512. end;
  1513. if OItem2.OpActive then
  1514. begin
  1515. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  1516. sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
  1517. end;
  1518. if OItem3.OpActive then
  1519. begin
  1520. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  1521. sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
  1522. end;
  1523. if OItem4.OpActive then
  1524. begin
  1525. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  1526. sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
  1527. end;
  1528. if sl_RegCombi <> '' then
  1529. begin
  1530. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  1531. result.Add(sl_Inst + sl_RegCombi);
  1532. sl_RegCombi := '';
  1533. end;
  1534. end;
  1535. end;
  1536. end;
  1537. end;
  1538. end
  1539. else
  1540. begin
  1541. sl_Inst := format('%-20s', [aInst]);
  1542. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  1543. begin
  1544. if OItem1.OpActive then
  1545. begin
  1546. sl_RegCombi1 := OItem1.Values[il_Op1];
  1547. end
  1548. else sl_RegCombi1 := '';
  1549. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  1550. begin
  1551. if OItem2.OpActive then
  1552. begin
  1553. sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
  1554. end
  1555. else sl_RegCombi2 := sl_RegCombi1;
  1556. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  1557. begin
  1558. if OItem3.OpActive then
  1559. begin
  1560. sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
  1561. end
  1562. else sl_RegCombi3 := sl_RegCombi2;
  1563. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  1564. begin
  1565. if OItem4.OpActive then
  1566. begin
  1567. sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
  1568. end
  1569. else sl_RegCombi := sl_RegCombi3;
  1570. if sl_RegCombi <> '' then
  1571. begin
  1572. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  1573. result.Add(sl_Inst + sl_RegCombi);
  1574. sl_RegCombi := '';
  1575. end;
  1576. end;
  1577. end;
  1578. end;
  1579. end;
  1580. end;
  1581. finally
  1582. FreeAndNil(OItem4);
  1583. end;
  1584. finally
  1585. FreeAndNil(OItem3);
  1586. end;
  1587. finally
  1588. FreeAndNil(OItem2);
  1589. end;
  1590. finally
  1591. FreeAndNil(OItem1);
  1592. end;
  1593. end;
  1594. function TAsmTestGenerator.InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3,
  1595. aOp4: String): TStringList;
  1596. var
  1597. i: integer;
  1598. Item: TOperandListItem;
  1599. OItem1: TOperandListItem;
  1600. OItem2: TOperandListItem;
  1601. OItem3: TOperandListItem;
  1602. OItem4: TOperandListItem;
  1603. il_Op: integer;
  1604. il_Op1: integer;
  1605. il_Op2: integer;
  1606. il_Op3: integer;
  1607. il_Op4: integer;
  1608. sSuffix: string;
  1609. sl_Operand: String;
  1610. sl_Inst : String;
  1611. sl_RegCombi: String;
  1612. sl_Prefix: String;
  1613. UsePrefix: boolean;
  1614. il_Operands: integer;
  1615. UsedParams: cardinal;
  1616. UseDefault: boolean;
  1617. sl_RegCombi1: string;
  1618. sl_RegCombi2: string;
  1619. sl_RegCombi3: string;
  1620. function PrepareOperandTyp(const aTyp: String): String;
  1621. begin
  1622. result := aTyp;
  1623. if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
  1624. if result = 'XMMRM128' then result := 'XMMRM';
  1625. if result = 'YMMRM256' then result := 'YMMRM';
  1626. end;
  1627. begin
  1628. result := TStringList.Create;
  1629. OItem1 := TOperandListItem.Create;
  1630. try
  1631. OItem2 := TOperandListItem.Create;
  1632. try
  1633. OItem3 := TOperandListItem.Create;
  1634. try
  1635. OItem4 := TOperandListItem.Create;
  1636. try
  1637. UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR
  1638. (UpperCase(aInst) = 'VCVTPD2PS') OR
  1639. (UpperCase(aInst) = 'VCVTSI2SD') OR
  1640. (UpperCase(aInst) = 'VCVTSI2SS') OR
  1641. (UpperCase(aInst) = 'VCVTTPD2DQ') or
  1642. (UpperCase(aInst) = 'VPMOVZXWQ') or
  1643. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  1644. (UpperCase(aInst) = 'VCVTPD2UDQ') or
  1645. (UpperCase(aInst) = 'VCVTTPD2UDQ') or
  1646. (UpperCase(aInst) = 'VCVTUQQ2PS') or
  1647. (UpperCase(aInst) = 'VCVTQQ2PS') or
  1648. (UpperCase(aInst) = 'VCVTUSI2SD') or
  1649. (UpperCase(aInst) = 'VCVTUSI2SS') or
  1650. (UpperCase(aInst) = 'VFPCLASSPD') or
  1651. (UpperCase(aInst) = 'VFPCLASSPS') or
  1652. (UpperCase(aInst) = 'VCMPSS')
  1653. ;
  1654. for il_Op := 1 to 4 do
  1655. begin
  1656. sl_Prefix := '';
  1657. case il_Op of
  1658. 1: begin
  1659. Item := OItem1;
  1660. sl_Operand := aOp1;
  1661. end;
  1662. 2: begin
  1663. Item := OItem2;
  1664. sl_Operand := aOp2;
  1665. end;
  1666. 3: begin
  1667. Item := OItem3;
  1668. sl_Operand := aOp3;
  1669. end;
  1670. 4: begin
  1671. Item := OItem4;
  1672. sl_Operand := aOp4;
  1673. end;
  1674. end;
  1675. sl_Operand := PrepareOperandTyp(sl_Operand);
  1676. if (AnsiSameText(sl_Operand, 'XMMREG')) or
  1677. (AnsiSameText(sl_Operand, 'XMMREG_M')) or
  1678. (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
  1679. (AnsiSameText(sl_Operand, 'XMMREG_ER')) or
  1680. (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then
  1681. begin
  1682. Item.OpNumber := il_Op;
  1683. Item.OpTyp := otXMMReg;
  1684. Item.OpActive := true;
  1685. Item.Values.Add('XMM0');
  1686. end
  1687. else if (AnsiSameText(sl_Operand, 'XMMRM')) or
  1688. (AnsiSameText(sl_Operand, 'XMMRM_M')) or
  1689. (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or
  1690. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  1691. (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then
  1692. begin
  1693. Item.OpNumber := il_Op;
  1694. Item.OpTyp := otXMMRM;
  1695. Item.OpActive := true;
  1696. if UsePrefix then sl_Prefix := 'oword ';
  1697. Item.Values.Add(' lOWord');
  1698. Item.Values.Add(' gOWord');
  1699. Item.Values.Add(' oword lOWord');
  1700. Item.Values.Add(' oword gOWord');
  1701. end
  1702. else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
  1703. (AnsiSameText(sl_Operand, 'XMMRM8_M')) or
  1704. (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or
  1705. (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or
  1706. (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then
  1707. begin
  1708. Item.OpNumber := il_Op;
  1709. Item.OpTyp := otXMMRM8;
  1710. Item.OpActive := true;
  1711. if UsePrefix then sl_Prefix := 'byte ';
  1712. Item.Values.Add('lbyte');
  1713. Item.Values.Add('gbyte');
  1714. end
  1715. else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
  1716. (AnsiSameText(sl_Operand, 'XMMRM16_M')) or
  1717. (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or
  1718. (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or
  1719. (AnsiSameText(sl_Operand, 'XMMRM16_SAE'))
  1720. then
  1721. begin
  1722. Item.OpNumber := il_Op;
  1723. Item.OpTyp := otXMMRM16;
  1724. Item.OpActive := true;
  1725. Item.Values.Add('lword');
  1726. Item.Values.Add('gword');
  1727. end
  1728. else if (AnsiSameText(sl_Operand, 'YMMREG')) or
  1729. (AnsiSameText(sl_Operand, 'YMMREG_M')) or
  1730. (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
  1731. (AnsiSameText(sl_Operand, 'YMMREG_ER')) or
  1732. (AnsiSameText(sl_Operand, 'YMMREG_SAE'))
  1733. then
  1734. begin
  1735. Item.OpNumber := il_Op;
  1736. Item.OpTyp := otYMMReg;
  1737. Item.OpActive := true;
  1738. Item.Values.Add('YMM0');
  1739. end
  1740. else if (AnsiSameText(sl_Operand, 'YMMRM')) or
  1741. (AnsiSameText(sl_Operand, 'YMMRM_M')) or
  1742. (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or
  1743. (AnsiSameText(sl_Operand, 'YMMRM_ER')) or
  1744. (AnsiSameText(sl_Operand, 'YMMRM_SAE'))
  1745. then
  1746. begin
  1747. Item.OpNumber := il_Op;
  1748. Item.OpTyp := otYMMRM;
  1749. Item.OpActive := true;
  1750. Item.Values.Add('lYWord');
  1751. Item.Values.Add('gYWord');
  1752. end
  1753. else if (AnsiSameText(sl_Operand, 'ZMMREG')) or
  1754. (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
  1755. (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
  1756. (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or
  1757. (AnsiSameText(sl_Operand, 'ZMMREG_SAE'))
  1758. then
  1759. begin
  1760. Item.OpNumber := il_Op;
  1761. Item.OpTyp := otZMMReg;
  1762. Item.OpActive := true;
  1763. Item.Values.Add('ZMM0');
  1764. end
  1765. else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
  1766. (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
  1767. (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
  1768. (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
  1769. (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
  1770. then
  1771. begin
  1772. Item.OpNumber := il_Op;
  1773. Item.OpTyp := otZMMRM;
  1774. Item.OpActive := true;
  1775. Item.Values.Add('lZWord');
  1776. Item.Values.Add('gZWord');
  1777. end
  1778. else if AnsiSameText(sl_Operand, 'MEM8') then
  1779. begin
  1780. Item.OpNumber := il_Op;
  1781. Item.OpTyp := otMEM8;
  1782. Item.OpActive := true;
  1783. Item.Values.Add('lByte');
  1784. Item.Values.Add('gByte');
  1785. end
  1786. else if AnsiSameText(sl_Operand, 'MEM16') or
  1787. AnsiSameText(sl_Operand, 'MEM16_M') then
  1788. begin
  1789. Item.OpNumber := il_Op;
  1790. Item.OpTyp := otMEM16;
  1791. Item.OpActive := true;
  1792. Item.Values.Add('lWord');
  1793. Item.Values.Add('gWord');
  1794. end
  1795. else if AnsiSameText(sl_Operand, 'MEM32') or
  1796. AnsiSameText(sl_Operand, 'MEM32_M') or
  1797. AnsiSameText(sl_Operand, 'MEM32_MZ') then
  1798. begin
  1799. Item.OpNumber := il_Op;
  1800. Item.OpTyp := otMEM32;
  1801. Item.OpActive := true;
  1802. Item.Values.Add('lDWord');
  1803. Item.Values.Add('gDWord');
  1804. end
  1805. else if (AnsiSameText(sl_Operand, 'MEM64')) or
  1806. (AnsiSameText(sl_Operand, 'MEM64_M')) or
  1807. (AnsiSameText(sl_Operand, 'MEM64_MZ')) then
  1808. begin
  1809. Item.OpNumber := il_Op;
  1810. Item.OpTyp := otMEM64;
  1811. Item.OpActive := true;
  1812. Item.Values.Add('lQWord');
  1813. Item.Values.Add('gQWord');
  1814. end
  1815. else if (AnsiSameText(sl_Operand, 'MEM128')) or
  1816. (AnsiSameText(sl_Operand, 'MEM128_M')) or
  1817. (AnsiSameText(sl_Operand, 'MEM128_MZ')) then
  1818. begin
  1819. Item.OpNumber := il_Op;
  1820. Item.OpTyp := otMEM128;
  1821. Item.OpActive := true;
  1822. Item.Values.Add('lOWord');
  1823. Item.Values.Add('gOWord');
  1824. end
  1825. else if (AnsiSameText(sl_Operand, 'MEM256')) or
  1826. (AnsiSameText(sl_Operand, 'MEM256_M')) or
  1827. (AnsiSameText(sl_Operand, 'MEM256_MZ')) then
  1828. begin
  1829. Item.OpNumber := il_Op;
  1830. Item.OpTyp := otMEM256;
  1831. Item.OpActive := true;
  1832. Item.Values.Add('lYWord');
  1833. Item.Values.Add('gYWord');
  1834. end
  1835. else if (AnsiSameText(sl_Operand, 'MEM512')) or
  1836. (AnsiSameText(sl_Operand, 'MEM512_M')) or
  1837. (AnsiSameText(sl_Operand, 'MEM512_MZ')) then
  1838. begin
  1839. Item.OpNumber := il_Op;
  1840. Item.OpTyp := otMEM512;
  1841. Item.OpActive := true;
  1842. Item.Values.Add('lZWord');
  1843. Item.Values.Add('gZWord');
  1844. end
  1845. else if AnsiSameText(sl_Operand, 'REG8') then
  1846. begin
  1847. Item.OpNumber := il_Op;
  1848. Item.OpTyp := otREG8;
  1849. Item.OpActive := true;
  1850. Item.Values.Add('al');
  1851. end
  1852. else if AnsiSameText(sl_Operand, 'REG16') then
  1853. begin
  1854. Item.OpNumber := il_Op;
  1855. Item.OpTyp := otREG16;
  1856. Item.OpActive := true;
  1857. Item.Values.Add('ax');
  1858. end
  1859. else if AnsiSameText(sl_Operand, 'REG32') then
  1860. begin
  1861. Item.OpNumber := il_Op;
  1862. Item.OpTyp := otREG32;
  1863. Item.OpActive := true;
  1864. Item.Values.Add('eax');
  1865. end
  1866. else if AnsiSameText(sl_Operand, 'REG64') then
  1867. begin
  1868. Item.OpNumber := il_Op;
  1869. Item.OpTyp := otREG64;
  1870. Item.OpActive := true;
  1871. Item.Values.Add('rax');
  1872. end
  1873. else if AnsiSameText(sl_Operand, 'RM32') then
  1874. begin
  1875. Item.OpNumber := il_Op;
  1876. Item.OpTyp := otRM32;
  1877. Item.OpActive := true;
  1878. Item.Values.Add('lDWord');
  1879. Item.Values.Add('gDWord');
  1880. end
  1881. else if AnsiSameText(sl_Operand, 'RM64') then
  1882. begin
  1883. Item.OpNumber := il_Op;
  1884. Item.OpTyp := otRM64;
  1885. Item.OpActive := true;
  1886. Item.Values.Add('lQWord');
  1887. Item.Values.Add('gQWord');
  1888. end
  1889. else if AnsiSameText(sl_Operand, 'IMM8') then
  1890. begin
  1891. Item.OpNumber := il_Op;
  1892. Item.OpTyp := otIMM8;
  1893. Item.OpActive := true;
  1894. Item.Values.Add('0');
  1895. end
  1896. else if AnsiSameText(sl_Operand, 'XMEM32') or
  1897. AnsiSameText(sl_Operand, 'XMEM32_M') then
  1898. begin
  1899. Item.OpNumber := il_Op;
  1900. Item.OpTyp := otXMEM32;
  1901. Item.OpActive := true;
  1902. end
  1903. else if AnsiSameText(sl_Operand, 'XMEM64') or
  1904. AnsiSameText(sl_Operand, 'XMEM64_M') then
  1905. begin
  1906. Item.OpNumber := il_Op;
  1907. Item.OpTyp := otXMEM64;
  1908. Item.OpActive := true;
  1909. end
  1910. else if AnsiSameText(sl_Operand, 'YMEM32') or
  1911. AnsiSameText(sl_Operand, 'YMEM32_M') then
  1912. begin
  1913. Item.OpNumber := il_Op;
  1914. Item.OpTyp := otYMEM32;
  1915. Item.OpActive := true;
  1916. end
  1917. else if AnsiSameText(sl_Operand, 'YMEM64') or
  1918. AnsiSameText(sl_Operand, 'YMEM64_M') then
  1919. begin
  1920. Item.OpNumber := il_Op;
  1921. Item.OpTyp := otYMEM64;
  1922. Item.OpActive := true;
  1923. if UsePrefix then sl_Prefix := 'yword ';
  1924. end
  1925. else if AnsiSameText(sl_Operand, 'ZMEM32') or
  1926. AnsiSameText(sl_Operand, 'ZMEM32_M') then
  1927. begin
  1928. Item.OpNumber := il_Op;
  1929. Item.OpTyp := otZMEM32;
  1930. Item.OpActive := true;
  1931. if UsePrefix then sl_Prefix := 'zword ';
  1932. end
  1933. else if AnsiSameText(sl_Operand, 'ZMEM64') or
  1934. AnsiSameText(sl_Operand, 'ZMEM64_M') then
  1935. begin
  1936. Item.OpNumber := il_Op;
  1937. Item.OpTyp := otZMEM64;
  1938. Item.OpActive := true;
  1939. if UsePrefix then sl_Prefix := 'zword ';
  1940. end
  1941. else if AnsiSameText(sl_Operand, '2B32') then
  1942. begin
  1943. Item.OpNumber := il_Op;
  1944. Item.OpTyp := otB32;
  1945. Item.OpActive := true;
  1946. Item.Values.Add('lDWord {1to2}');
  1947. Item.Values.Add('gDWord {1to2}');
  1948. end
  1949. else if AnsiSameText(sl_Operand, '4B32') then
  1950. begin
  1951. Item.OpNumber := il_Op;
  1952. Item.OpTyp := otB32;
  1953. Item.OpActive := true;
  1954. Item.Values.Add('lDWord {1to4}');
  1955. Item.Values.Add('gDWord {1to4}');
  1956. end
  1957. else if AnsiSameText(sl_Operand, '8B32') then
  1958. begin
  1959. Item.OpNumber := il_Op;
  1960. Item.OpTyp := otB32;
  1961. Item.OpActive := true;
  1962. Item.Values.Add('lDWord {1to8}');
  1963. Item.Values.Add('gDWord {1to8}');
  1964. end
  1965. else if AnsiSameText(sl_Operand, '16B32') then
  1966. begin
  1967. Item.OpNumber := il_Op;
  1968. Item.OpTyp := otB32;
  1969. Item.OpActive := true;
  1970. Item.Values.Add('lDWord {1to16}');
  1971. Item.Values.Add('gDWord {1to16}');
  1972. end
  1973. else if AnsiSameText(sl_Operand, '2B64') then
  1974. begin
  1975. Item.OpNumber := il_Op;
  1976. Item.OpTyp := otB64;
  1977. Item.OpActive := true;
  1978. Item.Values.Add('lQWord {1to2}');
  1979. Item.Values.Add('gQWord {1to2}');
  1980. end
  1981. else if AnsiSameText(sl_Operand, '4B64') then
  1982. begin
  1983. Item.OpNumber := il_Op;
  1984. Item.OpTyp := otB64;
  1985. Item.OpActive := true;
  1986. Item.Values.Add('lQWord {1to4}');
  1987. Item.Values.Add('gQWord {1to4}');
  1988. end
  1989. else if AnsiSameText(sl_Operand, '8B64') then
  1990. begin
  1991. Item.OpNumber := il_Op;
  1992. Item.OpTyp := otB64;
  1993. Item.OpActive := true;
  1994. Item.Values.Add('lQWord {1to8}');
  1995. Item.Values.Add('gQWord {1to8}');
  1996. end
  1997. else if AnsiSameText(sl_Operand, '16B64') then
  1998. begin
  1999. Item.OpNumber := il_Op;
  2000. Item.OpTyp := otB64;
  2001. Item.OpActive := true;
  2002. Item.Values.Add('lQWord {1to16}');
  2003. Item.Values.Add('gQWord {1to16}');
  2004. end
  2005. else if AnsiSameText(sl_Operand, 'KREG') or
  2006. AnsiSameText(sl_Operand, 'KREG_M') then
  2007. begin
  2008. Item.OpNumber := il_Op;
  2009. Item.OpTyp := otKREG;
  2010. Item.OpActive := true;
  2011. Item.Values.Add('k1');
  2012. end
  2013. else if trim(sl_Operand) = '' then
  2014. begin
  2015. Item.OpNumber := il_Op;
  2016. Item.OpTyp := otUnknown;
  2017. Item.OpActive := false;
  2018. Item.Values.Add('');
  2019. end
  2020. else
  2021. begin
  2022. Item.OpNumber := il_Op;
  2023. Item.OpTyp := otUnknown;
  2024. Item.OpActive := false;
  2025. Item.Values.Add('?' + sl_Operand);
  2026. end
  2027. end;
  2028. sl_RegCombi := '';
  2029. il_Operands := 0;
  2030. UsedParams := 0;
  2031. if OItem1.OpActive then
  2032. begin
  2033. inc(il_Operands);
  2034. UsedParams := UsedParams or 1;
  2035. end;
  2036. if OItem2.OpActive then
  2037. begin
  2038. inc(il_Operands);
  2039. UsedParams := UsedParams or 2;
  2040. end;
  2041. if OItem3.OpActive then
  2042. begin
  2043. inc(il_Operands);
  2044. UsedParams := UsedParams or 4;
  2045. end;
  2046. if OItem4.OpActive then
  2047. begin
  2048. inc(il_Operands);
  2049. UsedParams := UsedParams or 8;
  2050. end;
  2051. case il_Operands of
  2052. 1: UseDefault := UsedParams <> 1;
  2053. 2: UseDefault := UsedParams <> 3;
  2054. 3: UseDefault := UsedParams <> 7;
  2055. 4: UseDefault := UsedParams <> 15;
  2056. else UseDefault := true;
  2057. end;
  2058. //UseDefault := true;
  2059. if UseDefault then
  2060. begin
  2061. sl_Inst := format('%-20s', [aInst]);
  2062. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2063. begin
  2064. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2065. begin
  2066. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2067. begin
  2068. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2069. begin
  2070. sl_RegCombi := '';
  2071. if OItem1.OpActive then
  2072. begin
  2073. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2074. sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
  2075. end;
  2076. if OItem2.OpActive then
  2077. begin
  2078. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2079. sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
  2080. end;
  2081. if OItem3.OpActive then
  2082. begin
  2083. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2084. sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
  2085. end;
  2086. if OItem4.OpActive then
  2087. begin
  2088. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  2089. sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
  2090. end;
  2091. if sl_RegCombi <> '' then
  2092. begin
  2093. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  2094. result.Add(sl_Inst + sl_RegCombi);
  2095. sl_RegCombi := '';
  2096. end;
  2097. end;
  2098. end;
  2099. end;
  2100. end;
  2101. end
  2102. else
  2103. begin
  2104. sl_Inst := format('%-20s', [aInst]);
  2105. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  2106. begin
  2107. if OItem1.OpActive then
  2108. begin
  2109. sl_RegCombi1 := OItem1.Values[il_Op1];
  2110. end
  2111. else sl_RegCombi1 := '';
  2112. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  2113. begin
  2114. if OItem2.OpActive then
  2115. begin
  2116. sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
  2117. end
  2118. else sl_RegCombi2 := sl_RegCombi1;
  2119. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  2120. begin
  2121. if OItem3.OpActive then
  2122. begin
  2123. sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
  2124. end
  2125. else sl_RegCombi3 := sl_RegCombi2;
  2126. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  2127. begin
  2128. if OItem4.OpActive then
  2129. begin
  2130. sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
  2131. end
  2132. else sl_RegCombi := sl_RegCombi3;
  2133. if sl_RegCombi <> '' then
  2134. begin
  2135. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  2136. result.Add(sl_Inst + sl_RegCombi);
  2137. sl_RegCombi := '';
  2138. end;
  2139. end;
  2140. end;
  2141. end;
  2142. end;
  2143. end;
  2144. finally
  2145. FreeAndNil(OItem4);
  2146. end;
  2147. finally
  2148. FreeAndNil(OItem3);
  2149. end;
  2150. finally
  2151. FreeAndNil(OItem2);
  2152. end;
  2153. finally
  2154. FreeAndNil(OItem1);
  2155. end;
  2156. end;
  2157. constructor TAsmTestGenerator.Create;
  2158. begin
  2159. inherited;
  2160. FX64 := true;
  2161. FAVX512 := false;
  2162. FReg8 := TStringList.Create;
  2163. FReg16 := TStringList.Create;
  2164. FReg32Base := TStringList.Create;
  2165. FReg32Index := TStringList.Create;
  2166. FReg64Base := TStringList.Create;
  2167. FReg64Index := TStringList.Create;
  2168. FReg6432Base := TStringList.Create;
  2169. FReg6432Index := TStringList.Create;
  2170. FReg32XMMIndex := TStringList.Create;
  2171. FReg32YMMIndex := TStringList.Create;
  2172. FReg32ZMMIndex := TStringList.Create;
  2173. FReg64XMMIndex := TStringList.Create;
  2174. FReg64YMMIndex := TStringList.Create;
  2175. FReg64ZMMIndex := TStringList.Create;
  2176. FRegKREG := TStringList.Create;
  2177. FReg8.Add('AL');
  2178. FReg8.Add('BL');
  2179. FReg8.Add('CL');
  2180. FReg8.Add('DL');
  2181. FReg16.Add('AX');
  2182. FReg16.Add('BX');
  2183. FReg16.Add('CX');
  2184. FReg16.Add('DX');
  2185. FReg32Base.Add('EAX');
  2186. FReg32Base.Add('EBX');
  2187. FReg32Base.Add('ECX');
  2188. FReg32Base.Add('EDX');
  2189. //FReg32Base.Add('ESP');
  2190. //FReg32Base.Add('EBP');
  2191. FReg32Base.Add('EDI');
  2192. FReg32Base.Add('ESI');
  2193. FReg32Index.Add('EAX');
  2194. FReg32Index.Add('EBX');
  2195. FReg32Index.Add('ECX');
  2196. FReg32Index.Add('EDX');
  2197. //FReg32Index.Add('EBP');
  2198. FReg32Index.Add('EDI');
  2199. FReg32Index.Add('ESI');
  2200. FReg64Base.Add('RAX');
  2201. FReg64Base.Add('RBX');
  2202. FReg64Base.Add('RCX');
  2203. FReg64Base.Add('RDX');
  2204. //FReg64Base.Add('RSP');
  2205. //FReg64Base.Add('RBP');
  2206. FReg64Base.Add('RDI');
  2207. FReg64Base.Add('RSI');
  2208. FReg64Base.Add('R8');
  2209. FReg64Base.Add('R9');
  2210. FReg64Base.Add('R10');
  2211. FReg64Base.Add('R11');
  2212. FReg64Base.Add('R12');
  2213. FReg64Base.Add('R13');
  2214. FReg64Base.Add('R14');
  2215. FReg64Base.Add('R15');
  2216. FReg64Index.Add('RAX');
  2217. FReg64Index.Add('RBX');
  2218. FReg64Index.Add('RCX');
  2219. FReg64Index.Add('RDX');
  2220. //FReg64Index.Add('RBP');
  2221. FReg64Index.Add('RDI');
  2222. FReg64Index.Add('RSI');
  2223. FReg64Index.Add('R8');
  2224. FReg64Index.Add('R9');
  2225. FReg64Index.Add('R10');
  2226. FReg64Index.Add('R11');
  2227. FReg64Index.Add('R12');
  2228. FReg64Index.Add('R13');
  2229. FReg64Index.Add('R14');
  2230. FReg64Index.Add('R15');
  2231. FReg6432Base.Add('EAX');
  2232. FReg6432Base.Add('EBX');
  2233. FReg6432Base.Add('ECX');
  2234. FReg6432Base.Add('EDX');
  2235. FReg6432Base.Add('ESP');
  2236. //FReg6432Base.Add('EBP');
  2237. FReg6432Base.Add('EDI');
  2238. FReg6432Base.Add('ESI');
  2239. FReg6432Base.Add('R8D');
  2240. FReg6432Base.Add('R9D');
  2241. FReg6432Base.Add('R10D');
  2242. FReg6432Base.Add('R11D');
  2243. FReg6432Base.Add('R12D');
  2244. FReg6432Base.Add('R13D');
  2245. FReg6432Base.Add('R14D');
  2246. FReg6432Base.Add('R15D');
  2247. FReg6432Index.Add('EAX');
  2248. FReg6432Index.Add('EBX');
  2249. FReg6432Index.Add('ECX');
  2250. FReg6432Index.Add('EDX');
  2251. //FReg6432Index.Add('EBP');
  2252. FReg6432Index.Add('EDI');
  2253. FReg6432Index.Add('ESI');
  2254. FReg6432Index.Add('R8D');
  2255. FReg6432Index.Add('R9D');
  2256. FReg6432Index.Add('R10D');
  2257. FReg6432Index.Add('R11D');
  2258. FReg6432Index.Add('R12D');
  2259. FReg6432Index.Add('R13D');
  2260. FReg6432Index.Add('R14D');
  2261. FReg6432Index.Add('R15D');
  2262. FReg32XMMIndex.ADD('XMM0');
  2263. FReg32XMMIndex.ADD('XMM1');
  2264. FReg32XMMIndex.ADD('XMM2');
  2265. FReg32XMMIndex.ADD('XMM3');
  2266. FReg32XMMIndex.ADD('XMM4');
  2267. FReg32XMMIndex.ADD('XMM5');
  2268. FReg32XMMIndex.ADD('XMM6');
  2269. FReg32XMMIndex.ADD('XMM7');
  2270. FReg32YMMIndex.ADD('YMM0');
  2271. FReg32YMMIndex.ADD('YMM1');
  2272. FReg32YMMIndex.ADD('YMM2');
  2273. FReg32YMMIndex.ADD('YMM3');
  2274. FReg32YMMIndex.ADD('YMM4');
  2275. FReg32YMMIndex.ADD('YMM5');
  2276. FReg32YMMIndex.ADD('YMM6');
  2277. FReg32YMMIndex.ADD('YMM7');
  2278. FReg32ZMMIndex.ADD('ZMM0');
  2279. FReg32ZMMIndex.ADD('ZMM1');
  2280. FReg32ZMMIndex.ADD('ZMM2');
  2281. FReg32ZMMIndex.ADD('ZMM3');
  2282. FReg32ZMMIndex.ADD('ZMM4');
  2283. FReg32ZMMIndex.ADD('ZMM5');
  2284. FReg32ZMMIndex.ADD('ZMM6');
  2285. FReg32ZMMIndex.ADD('ZMM7');
  2286. FReg64XMMIndex.ADD('XMM0');
  2287. FReg64XMMIndex.ADD('XMM1');
  2288. FReg64XMMIndex.ADD('XMM2');
  2289. FReg64XMMIndex.ADD('XMM3');
  2290. FReg64XMMIndex.ADD('XMM4');
  2291. FReg64XMMIndex.ADD('XMM5');
  2292. FReg64XMMIndex.ADD('XMM6');
  2293. FReg64XMMIndex.ADD('XMM7');
  2294. FReg64XMMIndex.ADD('XMM8');
  2295. FReg64XMMIndex.ADD('XMM9');
  2296. FReg64XMMIndex.ADD('XMM10');
  2297. FReg64XMMIndex.ADD('XMM11');
  2298. FReg64XMMIndex.ADD('XMM12');
  2299. FReg64XMMIndex.ADD('XMM13');
  2300. FReg64XMMIndex.ADD('XMM14');
  2301. FReg64XMMIndex.ADD('XMM15');
  2302. FReg64YMMIndex.ADD('YMM0');
  2303. FReg64YMMIndex.ADD('YMM1');
  2304. FReg64YMMIndex.ADD('YMM2');
  2305. FReg64YMMIndex.ADD('YMM3');
  2306. FReg64YMMIndex.ADD('YMM4');
  2307. FReg64YMMIndex.ADD('YMM5');
  2308. FReg64YMMIndex.ADD('YMM6');
  2309. FReg64YMMIndex.ADD('YMM7');
  2310. FReg64YMMIndex.ADD('YMM8');
  2311. FReg64YMMIndex.ADD('YMM9');
  2312. FReg64YMMIndex.ADD('YMM10');
  2313. FReg64YMMIndex.ADD('YMM11');
  2314. FReg64YMMIndex.ADD('YMM12');
  2315. FReg64YMMIndex.ADD('YMM13');
  2316. FReg64YMMIndex.ADD('YMM14');
  2317. FReg64YMMIndex.ADD('YMM15');
  2318. FReg64ZMMIndex.ADD('ZMM0');
  2319. FReg64ZMMIndex.ADD('ZMM1');
  2320. FReg64ZMMIndex.ADD('ZMM2');
  2321. FReg64ZMMIndex.ADD('ZMM3');
  2322. FReg64ZMMIndex.ADD('ZMM4');
  2323. FReg64ZMMIndex.ADD('ZMM5');
  2324. FReg64ZMMIndex.ADD('ZMM6');
  2325. FReg64ZMMIndex.ADD('ZMM7');
  2326. FReg64ZMMIndex.ADD('ZMM8');
  2327. FReg64ZMMIndex.ADD('ZMM9');
  2328. FReg64ZMMIndex.ADD('ZMM10');
  2329. FReg64ZMMIndex.ADD('ZMM11');
  2330. FReg64ZMMIndex.ADD('ZMM12');
  2331. FReg64ZMMIndex.ADD('ZMM13');
  2332. FReg64ZMMIndex.ADD('ZMM14');
  2333. FReg64ZMMIndex.ADD('ZMM15');
  2334. FReg64ZMMIndex.ADD('ZMM16');
  2335. FReg64ZMMIndex.ADD('ZMM17');
  2336. FReg64ZMMIndex.ADD('ZMM18');
  2337. FReg64ZMMIndex.ADD('ZMM19');
  2338. FReg64ZMMIndex.ADD('ZMM20');
  2339. FReg64ZMMIndex.ADD('ZMM21');
  2340. FReg64ZMMIndex.ADD('ZMM22');
  2341. FReg64ZMMIndex.ADD('ZMM23');
  2342. FReg64ZMMIndex.ADD('ZMM24');
  2343. FReg64ZMMIndex.ADD('ZMM25');
  2344. FReg64ZMMIndex.ADD('ZMM26');
  2345. FReg64ZMMIndex.ADD('ZMM27');
  2346. FReg64ZMMIndex.ADD('ZMM28');
  2347. FReg64ZMMIndex.ADD('ZMM29');
  2348. FReg64ZMMIndex.ADD('ZMM30');
  2349. FReg64ZMMIndex.ADD('ZMM31');
  2350. FRegKREG.ADD('K0');
  2351. FRegKREG.ADD('K1');
  2352. FRegKREG.ADD('K2');
  2353. FRegKREG.ADD('K3');
  2354. FRegKREG.ADD('K4');
  2355. FRegKREG.ADD('K5');
  2356. FRegKREG.ADD('K6');
  2357. FRegKREG.ADD('K7');
  2358. end;
  2359. destructor TAsmTestGenerator.Destroy;
  2360. begin
  2361. FreeAndNil(FReg8);
  2362. FreeAndNil(FReg16);
  2363. FreeAndNil(FReg32Base);
  2364. FreeAndNil(FReg32Index);
  2365. FreeAndNil(FReg64Base);
  2366. FreeAndNil(FReg64Index);
  2367. FreeAndNil(FReg6432Base);
  2368. FreeAndNil(FReg6432Index);
  2369. FreeAndNil(FReg32XMMIndex);
  2370. FreeAndNil(FReg32YMMIndex);
  2371. FreeAndNil(FReg32ZMMIndex);
  2372. FreeAndNil(FReg64XMMIndex);
  2373. FreeAndNil(FReg64YMMIndex);
  2374. FreeAndNil(FReg64ZMMIndex);
  2375. FreeAndnil(FRegKREG);
  2376. inherited;
  2377. end;
  2378. procedure TAsmTestGenerator.MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg,
  2379. aSLIndexReg, aRList: TStringList);
  2380. var
  2381. il_Base: integer;
  2382. il_Index: integer;
  2383. begin
  2384. for il_Base := 0 to aSLBaseReg.Count - 1 do
  2385. begin
  2386. aRList.Add(format(aPrefix + '[%s]%s', [aSLBaseReg[il_Base], aSuffix]));
  2387. for il_Index := 0 to aSLIndexReg.Count - 1 do
  2388. begin
  2389. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2390. aRList.Add(format(aPrefix + '[%s + %s + $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2391. aRList.Add(format(aPrefix + '[%s + %s + $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2392. aRList.Add(format(aPrefix + '[%s + %s - $10]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2393. aRList.Add(format(aPrefix + '[%s + %s - $40]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2394. aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2395. aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2396. aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2397. aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2398. aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2399. aRList.Add(format(aPrefix + '[%s + %s * 8 + 64]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2400. end;
  2401. end;
  2402. end;
  2403. procedure TAsmTestGenerator.VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String;
  2404. aSLBaseReg, aSLIndexReg, aRList: TStringList);
  2405. var
  2406. il_Base: integer;
  2407. il_Index: integer;
  2408. begin
  2409. //for il_Index := 0 to aSLIndexReg.Count - 1 do
  2410. //begin
  2411. // aRList.Add(format(aPrefix + '[%s]', [aSLIndexReg[il_Index]]));
  2412. //
  2413. // aRList.Add(format(aPrefix + '[%s * 2]', [aSLIndexReg[il_Index]]));
  2414. // aRList.Add(format(aPrefix + '[%s * 4]', [aSLIndexReg[il_Index]]));
  2415. // aRList.Add(format(aPrefix + '[%s * 8]', [aSLIndexReg[il_Index]]));
  2416. //
  2417. // aRList.Add(format(aPrefix + '[%s * 2 + 16]', [aSLIndexReg[il_Index]]));
  2418. // aRList.Add(format(aPrefix + '[%s * 4 + 32]', [aSLIndexReg[il_Index]]));
  2419. // aRList.Add(format(aPrefix + '[%s * 8 + 48]', [aSLIndexReg[il_Index]]));
  2420. //end;
  2421. for il_Base := 0 to aSLBaseReg.Count - 1 do
  2422. begin
  2423. //aRList.Add(format(aPrefix + '[%s]', [aSLBaseReg[il_Base]]));
  2424. for il_Index := 0 to aSLIndexReg.Count - 1 do
  2425. begin
  2426. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2427. aRList.Add(format(aPrefix + '[%s + %s * 2]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2428. aRList.Add(format(aPrefix + '[%s + %s * 4]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2429. aRList.Add(format(aPrefix + '[%s + %s * 8]%s', [aSLBaseReg[il_Base], aSLIndexReg[il_Index], aSuffix]));
  2430. //aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  2431. //aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  2432. //aRList.Add(format(aPrefix + '[%s + %s * 8 + 48]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  2433. aRList.Add(format(aPrefix + '[%s + %s]%s', [aSLIndexReg[il_Index], aSLBaseReg[il_Base], aSuffix]));
  2434. //aRList.Add(format(aPrefix + '[%s + %s + 16]', [aSLIndexReg[il_Index], aSLBaseReg[il_Base]]));
  2435. end;
  2436. end;
  2437. end;
  2438. class procedure TAsmTestGenerator.CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
  2439. aOp4: String; aSL: TStringList);
  2440. var
  2441. sl: TStringList;
  2442. begin
  2443. with TAsmTestGenerator.Create do
  2444. try
  2445. Fx64 := aX64;
  2446. FAVX512 := aAVX512;
  2447. FSAE := aSAE;
  2448. sl := InternalCalcTestData(aInst, aOp1, aOp2, aOp3, aOp4);
  2449. try
  2450. aSL.AddStrings(sl);
  2451. finally
  2452. FreeAndNil(sl);
  2453. end;
  2454. finally
  2455. Free;
  2456. end;
  2457. end;
  2458. class procedure TAsmTestGenerator.CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3,
  2459. aOp4: String; aSL: TStringList);
  2460. var
  2461. sl: TStringList;
  2462. begin
  2463. with TAsmTestGenerator.Create do
  2464. try
  2465. Fx64 := aX64;
  2466. FAVX512 := aAVX512;
  2467. FSAE := aSAE;
  2468. sl := InternalCalcTestDataMREF(aInst, aOp1, aOp2, aOp3, aOp4);
  2469. try
  2470. aSL.AddStrings(sl);
  2471. finally
  2472. FreeAndNil(sl);
  2473. end;
  2474. finally
  2475. Free;
  2476. end;
  2477. end;
  2478. class procedure TAsmTestGenerator.CalcTestInstFile;
  2479. var
  2480. i,j: integer;
  2481. sInst: string;
  2482. sI386: string;
  2483. sX8664: string;
  2484. sAVX512: string;
  2485. sOperands: string;
  2486. sLine: string;
  2487. sl: TStringList;
  2488. bVEX: boolean;
  2489. bEVEX: boolean;
  2490. b256 : boolean;
  2491. b512 : boolean;
  2492. begin
  2493. sl := TStringList.Create;
  2494. try
  2495. //tinsentry=packed record
  2496. // opcode : tasmop;
  2497. // ops : byte;
  2498. // //optypes : array[0..max_operands-1] of longint;
  2499. // optypes : array[0..3] of int64; //TG
  2500. // code : array[0..11] of char;
  2501. // flags : tinsflags;
  2502. //end;
  2503. for i := 0 to length(InsTab) - 1 do
  2504. begin
  2505. bVEX := false;
  2506. bEVEX := false;
  2507. b256 := false;
  2508. b512 := false;
  2509. //TG TODO delete
  2510. if instab[i].opcode = a_vtestps then
  2511. begin
  2512. b512 := b512;
  2513. end;
  2514. for j := 0 to length(InsTab[i].code) - 1 do
  2515. begin
  2516. case ord(InsTab[i].code[j]) of
  2517. 0: break;
  2518. 1,2,3: break;
  2519. 232: bEVEX := true;
  2520. 233: b512 := true;
  2521. 242: bVEX := true;
  2522. 244: b256 := true;
  2523. end;
  2524. end;
  2525. if bVEX or bEVEX then
  2526. begin
  2527. sInst := std_op2str[InsTab[i].opcode];
  2528. sI386 := '1';
  2529. sX8664 := '1';
  2530. if IF_X86_64 in InsTab[i].flags then
  2531. begin
  2532. sI386 := '0';
  2533. end;
  2534. if bEVEX then sAVX512 := '1'
  2535. else sAVX512 := '0';
  2536. sOperands := '';
  2537. for j := 0 to 3 do
  2538. begin
  2539. case InsTab[i].optypes[j] of
  2540. OT_XMMREG: sOperands := sOperands + 'XMMREG,';
  2541. OT_XMMREG_M: sOperands := sOperands + 'XMMREG_M,';
  2542. OT_XMMREG_MZ: sOperands := sOperands + 'XMMREG_MZ,';
  2543. OT_XMMREG_ER: sOperands := sOperands + 'XMMREG_ER,';
  2544. OT_XMMREG_SAE: sOperands := sOperands + 'XMMREG_SAE,';
  2545. OT_XMMRM: sOperands := sOperands + 'XMMRM,';
  2546. OT_XMMRM_MZ: sOperands := sOperands + 'XMMRM_MZ,';
  2547. OT_YMMREG: sOperands := sOperands + 'YMMREG,';
  2548. OT_YMMREG_M: sOperands := sOperands + 'YMMREG_M,';
  2549. OT_YMMREG_MZ: sOperands := sOperands + 'YMMREG_MZ,';
  2550. OT_YMMREG_ER: sOperands := sOperands + 'YMMREG_ER,';
  2551. OT_YMMREG_SAE: sOperands := sOperands + 'YMMREG_SAE,';
  2552. OT_YMMRM: sOperands := sOperands + 'YMMRM,';
  2553. OT_YMMRM_MZ: sOperands := sOperands + 'YMMRM_MZ,';
  2554. OT_ZMMREG: sOperands := sOperands + 'ZMMREG,';
  2555. OT_ZMMREG_M: sOperands := sOperands + 'ZMMREG_M,';
  2556. OT_ZMMREG_MZ: sOperands := sOperands + 'ZMMREG_MZ,';
  2557. OT_ZMMREG_ER: sOperands := sOperands + 'ZMMREG_ER,';
  2558. OT_ZMMREG_SAE: sOperands := sOperands + 'ZMMREG_SAE,';
  2559. OT_ZMMRM: sOperands := sOperands + 'ZMMRM,';
  2560. OT_ZMMRM_MZ: sOperands := sOperands + 'ZMMRM_MZ,';
  2561. OT_MEM32: sOperands := sOperands + 'MEM32,';
  2562. OT_MEM64: sOperands := sOperands + 'MEM64,';
  2563. OT_MEM128: sOperands := sOperands + 'MEM128,';
  2564. OT_MEM256: sOperands := sOperands + 'MEM256,';
  2565. OT_MEM512: sOperands := sOperands + 'MEM512,';
  2566. OT_REG32: sOperands := sOperands + 'REG32,';
  2567. OT_REG64: sOperands := sOperands + 'REG64,';
  2568. ot_rm_gpr or ot_bits32:
  2569. sOperands := sOperands + 'RM32,';
  2570. ot_rm_gpr or ot_bits64:
  2571. sOperands := sOperands + 'RM64,';
  2572. OT_XMEM32: sOperands := sOperands + 'XMEM32,';
  2573. OT_XMEM64: sOperands := sOperands + 'XMEM64,';
  2574. OT_YMEM32: sOperands := sOperands + 'YMEM32,';
  2575. OT_YMEM64: sOperands := sOperands + 'YMEM64,';
  2576. OT_IMM8: sOperands := sOperands + 'IMM8,';
  2577. OT_NONE: sOperands := sOperands + ',';
  2578. OT_BMEM32: if b512 then sOperands := sOperands + '16B32,'
  2579. else if b256 then sOperands := sOperands + '8B32,'
  2580. else sOperands := sOperands + '4B32,';
  2581. OT_BMEM64: if b512 then sOperands := sOperands + '8B32,'
  2582. else if b256 then sOperands := sOperands + '4B32,'
  2583. else sOperands := sOperands + '2B64,';
  2584. OT_KREG: sOperands := sOperands + 'KREG,';
  2585. OT_KREG_M: sOperands := sOperands + 'KREG_M,';
  2586. else sOperands := sOperands;
  2587. end;
  2588. end;
  2589. sOperands := copy(sOperands, 1, length(sOperands) - 1);
  2590. sl.Add(format('FOpCodeList.Add(''%s,%s,%s,%s,%s'');', [sInst, sI386, sX8664, sAVX512, sOperands]));
  2591. end;
  2592. end;
  2593. sl.Savetofile('/tmp/fpcavx512.txt');
  2594. // std_op2str
  2595. finally
  2596. FreeAndnil(sl);
  2597. end;
  2598. end;
  2599. end.