asmtestgenerator.pas 34 KB

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