asmtestgenerator.pas 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903
  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., 59 Temple Place - Suite 330, Boston,
  14. MA 02111-1307, 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, otEAX, otRAX, otMem32,
  22. otMem8, otMem16, otMem64, otMem128, otMem256, otREG64, otREG32, otRM32, otRM64, otIMM8);
  23. TOperandListItem = class(TObject)
  24. private
  25. FOpActive: boolean;
  26. FOpNumber: integer;
  27. FOpTyp: TOpType;
  28. FValues: TStringList;
  29. public
  30. constructor Create;
  31. destructor Destroy; override;
  32. property OpNumber: integer read FOpNumber write FOpNumber;
  33. property OpTyp: TOpType read FOpTyp write FOpTyp;
  34. property OpActive: boolean read FOpActive write FOpActive;
  35. property Values: TStringList read FValues;
  36. end;
  37. TOperandList = class(TBaseList)
  38. private
  39. function GetItems(aIndex: integer): TOperandListItem;
  40. public
  41. function Add(aItem: TOperandListItem): integer;
  42. property Items[aIndex: integer]: TOperandListItem read GetItems;
  43. end;
  44. TAsmTestGenerator = class(TObject)
  45. private
  46. FReg32Base : TStringList;
  47. FReg32Index : TStringList;
  48. FReg64Base : TStringList;
  49. FReg64Index : TStringList;
  50. FReg6432Base : TStringList;
  51. FReg6432Index : TStringList;
  52. Fx64: boolean;
  53. procedure MemRegBaseIndexCombi(const aPrefix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
  54. function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
  55. public
  56. constructor Create;
  57. destructor Destroy; override;
  58. class procedure CalcTestData(aX64: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList);
  59. property x64: boolean read Fx64;
  60. end;
  61. implementation
  62. uses SysUtils, Dialogs;
  63. { TOperandListItem }
  64. constructor TOperandListItem.Create;
  65. begin
  66. inherited;
  67. FOpActive := false;
  68. FOpNumber := -1;
  69. FOpTyp := otUnknown;
  70. FValues := TStringList.Create;
  71. end;
  72. destructor TOperandListItem.Destroy;
  73. begin
  74. FreeAndNil(FValues);
  75. inherited;
  76. end;
  77. { TOperandList }
  78. function TOperandList.Add(aItem: TOperandListItem): integer;
  79. begin
  80. result := FList.Add(aItem);
  81. end;
  82. function TOperandList.GetItems(aIndex: integer): TOperandListItem;
  83. begin
  84. result := TOperandListItem(FList[aIndex]);
  85. end;
  86. { TAsmTestGenerator }
  87. function TAsmTestGenerator.InternalCalcTestData(const aInst, aOp1, aOp2, aOp3,
  88. aOp4: String): TStringList;
  89. var
  90. Item: TOperandListItem;
  91. OItem1: TOperandListItem;
  92. OItem2: TOperandListItem;
  93. OItem3: TOperandListItem;
  94. OItem4: TOperandListItem;
  95. il_Op: integer;
  96. il_Op1: integer;
  97. il_Op2: integer;
  98. il_Op3: integer;
  99. il_Op4: integer;
  100. sl_Operand: String;
  101. sl_Inst : String;
  102. sl_RegCombi: String;
  103. sl_Prefix: String;
  104. UsePrefix: boolean;
  105. il_Operands: integer;
  106. UsedParams: cardinal;
  107. UseDefault: boolean;
  108. sl_RegCombi1: string;
  109. sl_RegCombi2: string;
  110. sl_RegCombi3: string;
  111. function PrepareOperandTyp(const aTyp: String): String;
  112. begin
  113. result := aTyp;
  114. if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1);
  115. if result = 'XMMRM128' then result := 'XMMRM';
  116. if result = 'YMMRM256' then result := 'YMMRM';
  117. end;
  118. begin
  119. result := TStringList.Create;
  120. OItem1 := TOperandListItem.Create;
  121. try
  122. OItem2 := TOperandListItem.Create;
  123. try
  124. OItem3 := TOperandListItem.Create;
  125. try
  126. OItem4 := TOperandListItem.Create;
  127. try
  128. UsePrefix := (aInst = 'VCVTPD2DQ') OR
  129. (aInst = 'VCVTPD2PS') OR
  130. (aInst = 'VCVTSI2SD') OR
  131. (aInst = 'VCVTSI2SS') OR
  132. (aInst = 'VCVTTPD2DQ');
  133. for il_Op := 1 to 4 do
  134. begin
  135. sl_Prefix := '';
  136. case il_Op of
  137. 1: begin
  138. Item := OItem1;
  139. sl_Operand := aOp1;
  140. end;
  141. 2: begin
  142. Item := OItem2;
  143. sl_Operand := aOp2;
  144. end;
  145. 3: begin
  146. Item := OItem3;
  147. sl_Operand := aOp3;
  148. end;
  149. 4: begin
  150. Item := OItem4;
  151. sl_Operand := aOp4;
  152. end;
  153. end;
  154. sl_Operand := PrepareOperandTyp(sl_Operand);
  155. if AnsiSameText(sl_Operand, 'XMMREG') then
  156. begin
  157. Item.OpNumber := il_Op;
  158. Item.OpTyp := otXMMReg;
  159. Item.OpActive := true;
  160. Item.Values.Add('XMM0');
  161. Item.Values.Add('XMM1');
  162. Item.Values.Add('XMM2');
  163. Item.Values.Add('XMM3');
  164. Item.Values.Add('XMM4');
  165. Item.Values.Add('XMM5');
  166. Item.Values.Add('XMM6');
  167. Item.Values.Add('XMM7');
  168. if x64 then
  169. begin
  170. if aOp4 <> 'XMMREG' then
  171. begin
  172. Item.Values.Add('XMM8');
  173. Item.Values.Add('XMM9');
  174. Item.Values.Add('XMM10');
  175. Item.Values.Add('XMM11');
  176. Item.Values.Add('XMM12');
  177. Item.Values.Add('XMM13');
  178. Item.Values.Add('XMM14');
  179. Item.Values.Add('XMM15');
  180. end
  181. else
  182. begin
  183. Item.Values.Clear;
  184. Item.Values.Add('XMM0');
  185. Item.Values.Add('XMM7');
  186. Item.Values.Add('XMM8');
  187. Item.Values.Add('XMM15');
  188. end;
  189. end;
  190. end
  191. else if AnsiSameText(sl_Operand, 'XMMRM') then
  192. begin
  193. Item.OpNumber := il_Op;
  194. Item.OpTyp := otXMMRM;
  195. Item.OpActive := true;
  196. if UsePrefix then sl_Prefix := 'oword ';
  197. Item.Values.Add('XMM0');
  198. Item.Values.Add('XMM1');
  199. Item.Values.Add('XMM2');
  200. Item.Values.Add('XMM3');
  201. Item.Values.Add('XMM4');
  202. Item.Values.Add('XMM5');
  203. Item.Values.Add('XMM6');
  204. Item.Values.Add('XMM7');
  205. if x64 then
  206. begin
  207. Item.Values.Add('XMM8');
  208. Item.Values.Add('XMM9');
  209. Item.Values.Add('XMM10');
  210. Item.Values.Add('XMM11');
  211. Item.Values.Add('XMM12');
  212. Item.Values.Add('XMM13');
  213. Item.Values.Add('XMM14');
  214. Item.Values.Add('XMM15');
  215. //Item.Values.Add('[RIP]');
  216. //Item.Values.Add('[RIP + 16]');
  217. MemRegBaseIndexCombi(sl_Prefix, FReg64Base, FReg64Index, Item.Values);
  218. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  219. end
  220. else
  221. begin
  222. MemRegBaseIndexCombi(sl_Prefix, FReg32Base, FReg32Index, Item.Values);
  223. end;
  224. end
  225. else if AnsiSameText(sl_Operand, 'XMMRM8') then
  226. begin
  227. Item.OpNumber := il_Op;
  228. Item.OpTyp := otXMMRM8;
  229. Item.OpActive := true;
  230. if UsePrefix then sl_Prefix := 'byte ';
  231. Item.Values.Add('XMM0');
  232. Item.Values.Add('XMM1');
  233. Item.Values.Add('XMM2');
  234. Item.Values.Add('XMM3');
  235. Item.Values.Add('XMM4');
  236. Item.Values.Add('XMM5');
  237. Item.Values.Add('XMM6');
  238. Item.Values.Add('XMM7');
  239. if x64 then
  240. begin
  241. Item.Values.Add('XMM8');
  242. Item.Values.Add('XMM9');
  243. Item.Values.Add('XMM10');
  244. Item.Values.Add('XMM11');
  245. Item.Values.Add('XMM12');
  246. Item.Values.Add('XMM13');
  247. Item.Values.Add('XMM14');
  248. Item.Values.Add('XMM15');
  249. //Item.Values.Add('[RIP]');
  250. //Item.Values.Add('[RIP + 16]');
  251. MemRegBaseIndexCombi(sl_Prefix, FReg64Base, FReg64Index, Item.Values);
  252. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  253. end
  254. else
  255. begin
  256. MemRegBaseIndexCombi(sl_Prefix, FReg32Base, FReg32Index, Item.Values);
  257. end;
  258. end
  259. else if AnsiSameText(sl_Operand, 'XMMRM16') then
  260. begin
  261. Item.OpNumber := il_Op;
  262. Item.OpTyp := otXMMRM16;
  263. Item.OpActive := true;
  264. if UsePrefix then sl_Prefix := 'word ';
  265. Item.Values.Add('XMM0');
  266. Item.Values.Add('XMM1');
  267. Item.Values.Add('XMM2');
  268. Item.Values.Add('XMM3');
  269. Item.Values.Add('XMM4');
  270. Item.Values.Add('XMM5');
  271. Item.Values.Add('XMM6');
  272. Item.Values.Add('XMM7');
  273. if x64 then
  274. begin
  275. Item.Values.Add('XMM8');
  276. Item.Values.Add('XMM9');
  277. Item.Values.Add('XMM10');
  278. Item.Values.Add('XMM11');
  279. Item.Values.Add('XMM12');
  280. Item.Values.Add('XMM13');
  281. Item.Values.Add('XMM14');
  282. Item.Values.Add('XMM15');
  283. //Item.Values.Add('[RIP]');
  284. //Item.Values.Add('[RIP + 16]');
  285. MemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64Index, Item.Values);
  286. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  287. end
  288. else
  289. begin
  290. MemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32Index, Item.Values);
  291. end;
  292. end
  293. else if AnsiSameText(sl_Operand, 'YMMREG') then
  294. begin
  295. Item.OpNumber := il_Op;
  296. Item.OpTyp := otYMMReg;
  297. Item.OpActive := true;
  298. Item.Values.Add('YMM0');
  299. Item.Values.Add('YMM1');
  300. Item.Values.Add('YMM2');
  301. Item.Values.Add('YMM3');
  302. Item.Values.Add('YMM4');
  303. Item.Values.Add('YMM5');
  304. Item.Values.Add('YMM6');
  305. Item.Values.Add('YMM7');
  306. if x64 then
  307. begin
  308. if aOp4 <> 'YMMREG' then
  309. begin
  310. Item.Values.Add('YMM8');
  311. Item.Values.Add('YMM9');
  312. Item.Values.Add('YMM10');
  313. Item.Values.Add('YMM11');
  314. Item.Values.Add('YMM12');
  315. Item.Values.Add('YMM13');
  316. Item.Values.Add('YMM14');
  317. Item.Values.Add('YMM15');
  318. end
  319. else
  320. begin
  321. Item.Values.Clear;
  322. Item.Values.Add('YMM0');
  323. Item.Values.Add('YMM7');
  324. Item.Values.Add('YMM8');
  325. Item.Values.Add('YMM15');
  326. end;
  327. end;
  328. end
  329. else if AnsiSameText(sl_Operand, 'YMMRM') then
  330. begin
  331. Item.OpNumber := il_Op;
  332. Item.OpTyp := otYMMRM;
  333. Item.OpActive := true;
  334. if UsePrefix then sl_Prefix := 'yword ';
  335. Item.Values.Add('YMM0');
  336. Item.Values.Add('YMM1');
  337. Item.Values.Add('YMM2');
  338. Item.Values.Add('YMM3');
  339. Item.Values.Add('YMM4');
  340. Item.Values.Add('YMM5');
  341. Item.Values.Add('YMM6');
  342. Item.Values.Add('YMM7');
  343. if x64 then
  344. begin
  345. Item.Values.Add('YMM8');
  346. Item.Values.Add('YMM9');
  347. Item.Values.Add('YMM10');
  348. Item.Values.Add('YMM11');
  349. Item.Values.Add('YMM12');
  350. Item.Values.Add('YMM13');
  351. Item.Values.Add('YMM14');
  352. Item.Values.Add('YMM15');
  353. MemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64Index, Item.Values);
  354. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  355. end
  356. else
  357. begin
  358. MemRegBaseIndexCombi(sl_Prefix, FReg32Base, FReg32Index, Item.Values);
  359. end;
  360. end
  361. else if AnsiSameText(sl_Operand, 'MEM8') then
  362. begin
  363. Item.OpNumber := il_Op;
  364. Item.OpTyp := otMEM8;
  365. Item.OpActive := true;
  366. if UsePrefix then sl_Prefix := 'byte ';
  367. if x64 then
  368. begin
  369. MemRegBaseIndexCombi(sl_Prefix, FReg64Base, FReg64Index, Item.Values);
  370. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  371. end
  372. else MemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32Index, Item.Values);
  373. end
  374. else if AnsiSameText(sl_Operand, 'MEM16') then
  375. begin
  376. Item.OpNumber := il_Op;
  377. Item.OpTyp := otMEM16;
  378. Item.OpActive := true;
  379. if UsePrefix then sl_Prefix := 'word ';
  380. if x64 then
  381. begin
  382. MemRegBaseIndexCombi(sl_Prefix, FReg64Base, FReg64Index, Item.Values);
  383. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  384. end
  385. else MemRegBaseIndexCombi(sl_Prefix, FReg32Base, FReg32Index, Item.Values);
  386. end
  387. else if AnsiSameText(sl_Operand, 'MEM32') then
  388. begin
  389. Item.OpNumber := il_Op;
  390. Item.OpTyp := otMEM32;
  391. Item.OpActive := true;
  392. if UsePrefix then sl_Prefix := 'dword ';
  393. if x64 then
  394. begin
  395. MemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64Index, Item.Values);
  396. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  397. end
  398. else MemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32Index, Item.Values);
  399. end
  400. else if AnsiSameText(sl_Operand, 'MEM64') then
  401. begin
  402. Item.OpNumber := il_Op;
  403. Item.OpTyp := otMEM64;
  404. Item.OpActive := true;
  405. if UsePrefix then sl_Prefix := 'qword ';
  406. if x64 then
  407. begin
  408. MemRegBaseIndexCombi(sl_Prefix, FReg64Base, FReg64Index, Item.Values);
  409. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  410. end
  411. else MemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32Index, Item.Values);
  412. end
  413. else if AnsiSameText(sl_Operand, 'MEM128') then
  414. begin
  415. Item.OpNumber := il_Op;
  416. Item.OpTyp := otMEM128;
  417. Item.OpActive := true;
  418. if UsePrefix then sl_Prefix := 'oword ';
  419. if x64 then
  420. begin
  421. MemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64Index, Item.Values);
  422. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  423. end
  424. else MemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32Index, Item.Values);
  425. end
  426. else if AnsiSameText(sl_Operand, 'MEM256') then
  427. begin
  428. Item.OpNumber := il_Op;
  429. Item.OpTyp := otMEM256;
  430. Item.OpActive := true;
  431. if UsePrefix then sl_Prefix := 'yword ';
  432. if x64 then
  433. begin
  434. MemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64Index, Item.Values);
  435. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  436. end
  437. else MemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32Index, Item.Values);
  438. end
  439. else if AnsiSameText(sl_Operand, 'REG32') then
  440. begin
  441. Item.OpNumber := il_Op;
  442. Item.OpTyp := otREG32;
  443. Item.OpActive := true;
  444. if x64 then
  445. begin
  446. Item.Values.AddStrings(FReg32Base);
  447. end
  448. else Item.Values.AddStrings(FReg32Base);
  449. end
  450. else if AnsiSameText(sl_Operand, 'REG64') then
  451. begin
  452. Item.OpNumber := il_Op;
  453. Item.OpTyp := otREG64;
  454. Item.OpActive := true;
  455. if x64 then
  456. begin
  457. Item.Values.AddStrings(FReg64Base);
  458. end;
  459. end
  460. else if AnsiSameText(sl_Operand, 'RM32') then
  461. begin
  462. Item.OpNumber := il_Op;
  463. Item.OpTyp := otRM32;
  464. Item.OpActive := true;
  465. Item.Values.AddStrings(FReg32Base);
  466. if UsePrefix then sl_Prefix := 'dword ';
  467. if x64 then
  468. begin
  469. MemRegBaseIndexCombi(sl_Prefix, FReg64Base, FReg64Index, Item.Values);
  470. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  471. end
  472. else MemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32Index, Item.Values);
  473. end
  474. else if AnsiSameText(sl_Operand, 'RM64') then
  475. begin
  476. Item.OpNumber := il_Op;
  477. Item.OpTyp := otRM32;
  478. Item.OpActive := true;
  479. if UsePrefix then sl_Prefix := 'qword ';
  480. if x64 then
  481. begin
  482. Item.Values.AddStrings(FReg64Base);
  483. MemRegBaseIndexCombi(sl_Prefix, FReg64Base, FReg64Index, Item.Values);
  484. //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
  485. end
  486. else MemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32Index, Item.Values);
  487. end
  488. else if AnsiSameText(sl_Operand, 'IMM8') then
  489. begin
  490. Item.OpNumber := il_Op;
  491. Item.OpTyp := otIMM8;
  492. Item.OpActive := true;
  493. Item.Values.Add('0');
  494. end
  495. else
  496. begin
  497. Item.OpNumber := il_Op;
  498. Item.OpTyp := otUnknown;
  499. Item.OpActive := false;
  500. Item.Values.Add('');
  501. end;
  502. end;
  503. sl_RegCombi := '';
  504. il_Operands := 0;
  505. UsedParams := 0;
  506. if OItem1.OpActive then
  507. begin
  508. inc(il_Operands);
  509. UsedParams := UsedParams or 1;
  510. end;
  511. if OItem2.OpActive then
  512. begin
  513. inc(il_Operands);
  514. UsedParams := UsedParams or 2;
  515. end;
  516. if OItem3.OpActive then
  517. begin
  518. inc(il_Operands);
  519. UsedParams := UsedParams or 4;
  520. end;
  521. if OItem4.OpActive then
  522. begin
  523. inc(il_Operands);
  524. UsedParams := UsedParams or 8;
  525. end;
  526. case il_Operands of
  527. 1: UseDefault := UsedParams <> 1;
  528. 2: UseDefault := UsedParams <> 3;
  529. 3: UseDefault := UsedParams <> 7;
  530. 4: UseDefault := UsedParams <> 15;
  531. else UseDefault := true;
  532. end;
  533. //UseDefault := true;
  534. if UseDefault then
  535. begin
  536. sl_Inst := format('%-20s', [aInst]);
  537. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  538. begin
  539. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  540. begin
  541. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  542. begin
  543. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  544. begin
  545. sl_RegCombi := '';
  546. if OItem1.OpActive then
  547. begin
  548. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  549. sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1];
  550. end;
  551. if OItem2.OpActive then
  552. begin
  553. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  554. sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2];
  555. end;
  556. if OItem3.OpActive then
  557. begin
  558. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  559. sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3];
  560. end;
  561. if OItem4.OpActive then
  562. begin
  563. if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', ';
  564. sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4];
  565. end;
  566. if sl_RegCombi <> '' then
  567. begin
  568. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  569. result.Add(sl_Inst + sl_RegCombi);
  570. sl_RegCombi := '';
  571. end;
  572. end;
  573. end;
  574. end;
  575. end;
  576. end
  577. else
  578. begin
  579. sl_Inst := format('%-20s', [aInst]);
  580. for il_Op1 := 0 to OItem1.Values.Count - 1 do
  581. begin
  582. if OItem1.OpActive then
  583. begin
  584. sl_RegCombi1 := OItem1.Values[il_Op1];
  585. end
  586. else sl_RegCombi1 := '';
  587. for il_Op2 := 0 to OItem2.Values.Count - 1 do
  588. begin
  589. if OItem2.OpActive then
  590. begin
  591. sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2];
  592. end
  593. else sl_RegCombi2 := sl_RegCombi1;
  594. for il_Op3 := 0 to OItem3.Values.Count - 1 do
  595. begin
  596. if OItem3.OpActive then
  597. begin
  598. sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3];
  599. end
  600. else sl_RegCombi3 := sl_RegCombi2;
  601. for il_Op4 := 0 to OItem4.Values.Count - 1 do
  602. begin
  603. if OItem4.OpActive then
  604. begin
  605. sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4];
  606. end
  607. else sl_RegCombi := sl_RegCombi3;
  608. if sl_RegCombi <> '' then
  609. begin
  610. //result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
  611. result.Add(sl_Inst + sl_RegCombi);
  612. sl_RegCombi := '';
  613. end;
  614. end;
  615. end;
  616. end;
  617. end;
  618. end;
  619. finally
  620. FreeAndNil(OItem4);
  621. end;
  622. finally
  623. FreeAndNil(OItem3);
  624. end;
  625. finally
  626. FreeAndNil(OItem2);
  627. end;
  628. finally
  629. FreeAndNil(OItem1);
  630. end;
  631. end;
  632. constructor TAsmTestGenerator.Create;
  633. begin
  634. inherited;
  635. FX64 := true;
  636. FReg32Base := TStringList.Create;
  637. FReg32Index := TStringList.Create;
  638. FReg64Base := TStringList.Create;
  639. FReg64Index := TStringList.Create;
  640. FReg6432Base := TStringList.Create;
  641. FReg6432Index := TStringList.Create;
  642. FReg32Base.Add('EAX');
  643. FReg32Base.Add('EBX');
  644. FReg32Base.Add('ECX');
  645. FReg32Base.Add('EDX');
  646. FReg32Base.Add('ESP');
  647. FReg32Base.Add('EBP');
  648. FReg32Base.Add('EDI');
  649. FReg32Base.Add('ESI');
  650. FReg32Index.Add('EAX');
  651. FReg32Index.Add('EBX');
  652. FReg32Index.Add('ECX');
  653. FReg32Index.Add('EDX');
  654. FReg32Index.Add('EBP');
  655. FReg32Index.Add('EDI');
  656. FReg32Index.Add('ESI');
  657. FReg64Base.Add('RAX');
  658. FReg64Base.Add('RBX');
  659. FReg64Base.Add('RCX');
  660. FReg64Base.Add('RDX');
  661. FReg64Base.Add('RSP');
  662. FReg64Base.Add('RBP');
  663. FReg64Base.Add('RDI');
  664. FReg64Base.Add('RSI');
  665. FReg64Base.Add('R8');
  666. FReg64Base.Add('R9');
  667. FReg64Base.Add('R10');
  668. FReg64Base.Add('R11');
  669. FReg64Base.Add('R12');
  670. FReg64Base.Add('R13');
  671. FReg64Base.Add('R14');
  672. FReg64Base.Add('R15');
  673. FReg64Index.Add('RAX');
  674. FReg64Index.Add('RBX');
  675. FReg64Index.Add('RCX');
  676. FReg64Index.Add('RDX');
  677. FReg64Index.Add('RBP');
  678. FReg64Index.Add('RDI');
  679. FReg64Index.Add('RSI');
  680. FReg64Index.Add('R8');
  681. FReg64Index.Add('R9');
  682. FReg64Index.Add('R10');
  683. FReg64Index.Add('R11');
  684. FReg64Index.Add('R12');
  685. FReg64Index.Add('R13');
  686. FReg64Index.Add('R14');
  687. FReg64Index.Add('R15');
  688. FReg6432Base.Add('EAX');
  689. FReg6432Base.Add('EBX');
  690. FReg6432Base.Add('ECX');
  691. FReg6432Base.Add('EDX');
  692. FReg6432Base.Add('ESP');
  693. FReg6432Base.Add('EBP');
  694. FReg6432Base.Add('EDI');
  695. FReg6432Base.Add('ESI');
  696. FReg6432Base.Add('R8D');
  697. FReg6432Base.Add('R9D');
  698. FReg6432Base.Add('R10D');
  699. FReg6432Base.Add('R11D');
  700. FReg6432Base.Add('R12D');
  701. FReg6432Base.Add('R13D');
  702. FReg6432Base.Add('R14D');
  703. FReg6432Base.Add('R15D');
  704. FReg6432Index.Add('EAX');
  705. FReg6432Index.Add('EBX');
  706. FReg6432Index.Add('ECX');
  707. FReg6432Index.Add('EDX');
  708. FReg6432Index.Add('EBP');
  709. FReg6432Index.Add('EDI');
  710. FReg6432Index.Add('ESI');
  711. FReg6432Index.Add('R8D');
  712. FReg6432Index.Add('R9D');
  713. FReg6432Index.Add('R10D');
  714. FReg6432Index.Add('R11D');
  715. FReg6432Index.Add('R12D');
  716. FReg6432Index.Add('R13D');
  717. FReg6432Index.Add('R14D');
  718. FReg6432Index.Add('R15D');
  719. end;
  720. destructor TAsmTestGenerator.Destroy;
  721. begin
  722. FreeAndNil(FReg32Base);
  723. FreeAndNil(FReg32Index);
  724. FreeAndNil(FReg64Base);
  725. FreeAndNil(FReg64Index);
  726. FreeAndNil(FReg6432Base);
  727. FreeAndNil(FReg6432Index);
  728. inherited;
  729. end;
  730. procedure TAsmTestGenerator.MemRegBaseIndexCombi(const aPrefix: String; aSLBaseReg,
  731. aSLIndexReg, aRList: TStringList);
  732. var
  733. il_Base: integer;
  734. il_Index: integer;
  735. begin
  736. for il_Base := 0 to aSLBaseReg.Count - 1 do
  737. begin
  738. aRList.Add(format(aPrefix + '[%s]', [aSLBaseReg[il_Base]]));
  739. for il_Index := 0 to aSLIndexReg.Count - 1 do
  740. begin
  741. aRList.Add(format(aPrefix + '[%s + %s]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  742. aRList.Add(format(aPrefix + '[%s + %s * 2]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  743. aRList.Add(format(aPrefix + '[%s + %s * 4]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  744. aRList.Add(format(aPrefix + '[%s + %s * 8]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  745. aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  746. aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  747. aRList.Add(format(aPrefix + '[%s + %s * 8 + 48]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
  748. end;
  749. end;
  750. end;
  751. class procedure TAsmTestGenerator.CalcTestData(aX64: boolean; const aInst, aOp1, aOp2, aOp3,
  752. aOp4: String; aSL: TStringList);
  753. var
  754. sl: TStringList;
  755. begin
  756. with TAsmTestGenerator.Create do
  757. try
  758. Fx64 := aX64;
  759. sl := InternalCalcTestData(aInst, aOp1, aOp2, aOp3, aOp4);
  760. try
  761. aSL.AddStrings(sl);
  762. finally
  763. FreeAndNil(sl);
  764. end;
  765. finally
  766. Free;
  767. end;
  768. end;
  769. end.