bdiv_u64.inc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. type
  2. { TUInt64Bit1Test }
  3. TUInt64Bit1Test = class(TUInt64DivTest)
  4. protected
  5. function GetDivisor: QWord; override;
  6. procedure DoTestIteration(Iteration: Integer); override;
  7. public
  8. function TestTitle: shortstring; override;
  9. end;
  10. { TUInt64Bit1ModTest }
  11. TUInt64Bit1ModTest = class(TUInt64ModTest)
  12. protected
  13. function GetDivisor: QWord; override;
  14. procedure DoTestIteration(Iteration: Integer); override;
  15. public
  16. function TestTitle: shortstring; override;
  17. end;
  18. { TUInt64Bit2Test }
  19. TUInt64Bit2Test = class(TUInt64DivTest)
  20. protected
  21. function GetDivisor: QWord; override;
  22. procedure DoTestIteration(Iteration: Integer); override;
  23. public
  24. function TestTitle: shortstring; override;
  25. end;
  26. { TUInt64Bit2ModTest }
  27. TUInt64Bit2ModTest = class(TUInt64ModTest)
  28. protected
  29. function GetDivisor: QWord; override;
  30. procedure DoTestIteration(Iteration: Integer); override;
  31. public
  32. function TestTitle: shortstring; override;
  33. end;
  34. { TUInt64Bit3Test }
  35. TUInt64Bit3Test = class(TUInt64DivTest)
  36. protected
  37. function GetDivisor: QWord; override;
  38. procedure DoTestIteration(Iteration: Integer); override;
  39. public
  40. function TestTitle: shortstring; override;
  41. end;
  42. { TUInt64Bit3ModTest }
  43. TUInt64Bit3ModTest = class(TUInt64ModTest)
  44. protected
  45. function GetDivisor: QWord; override;
  46. procedure DoTestIteration(Iteration: Integer); override;
  47. public
  48. function TestTitle: shortstring; override;
  49. end;
  50. { TUInt64Bit7Test }
  51. TUInt64Bit7Test = class(TUInt64DivTest)
  52. protected
  53. function GetDivisor: QWord; override;
  54. procedure DoTestIteration(Iteration: Integer); override;
  55. public
  56. function TestTitle: shortstring; override;
  57. end;
  58. { TUInt64Bit7ModTest }
  59. TUInt64Bit7ModTest = class(TUInt64ModTest)
  60. protected
  61. function GetDivisor: QWord; override;
  62. procedure DoTestIteration(Iteration: Integer); override;
  63. public
  64. function TestTitle: shortstring; override;
  65. end;
  66. { TUInt64Bit10Test }
  67. TUInt64Bit10Test = class(TUInt64DivTest)
  68. protected
  69. function GetDivisor: QWord; override;
  70. procedure DoTestIteration(Iteration: Integer); override;
  71. public
  72. function TestTitle: shortstring; override;
  73. end;
  74. { TUInt64Bit10ModTest }
  75. TUInt64Bit10ModTest = class(TUInt64ModTest)
  76. protected
  77. function GetDivisor: QWord; override;
  78. procedure DoTestIteration(Iteration: Integer); override;
  79. public
  80. function TestTitle: shortstring; override;
  81. end;
  82. { TUInt64Bit100Test }
  83. TUInt64Bit100Test = class(TUInt64DivTest)
  84. protected
  85. function GetDivisor: QWord; override;
  86. procedure DoTestIteration(Iteration: Integer); override;
  87. public
  88. function TestTitle: shortstring; override;
  89. end;
  90. { TUInt64Bit100ModTest }
  91. TUInt64Bit100ModTest = class(TUInt64ModTest)
  92. protected
  93. function GetDivisor: QWord; override;
  94. procedure DoTestIteration(Iteration: Integer); override;
  95. public
  96. function TestTitle: shortstring; override;
  97. end;
  98. { TUInt64Bit1000000000Test }
  99. const
  100. FU64_1000000000Input: array[$0..$F] of QWord =
  101. (0, 1, 999999999, 1000000000, 1000000001, 5000000000,
  102. 7999999999999999999, 8000000000000000000, 8000000000000000001,
  103. QWord(15999999999999999999), QWord(16000000000000000000), QWord(16000000000000000001),
  104. $7FFFFFFFFFFFFFFF, QWord($8000000000000000), QWord($8000000000000001), QWord($FFFFFFFFFFFFFFFF));
  105. type
  106. TUInt64Bit1000000000Test = class(TUInt64DivTest)
  107. protected
  108. function GetDivisor: QWord; override;
  109. procedure DoTestIteration(Iteration: Integer); override;
  110. public
  111. function TestTitle: shortstring; override;
  112. end;
  113. TUInt64Bit1000000000ModTest = class(TUInt64ModTest)
  114. protected
  115. function GetDivisor: QWord; override;
  116. procedure DoTestIteration(Iteration: Integer); override;
  117. public
  118. function TestTitle: shortstring; override;
  119. end;
  120. { TUInt64Bit1Test }
  121. function TUInt64Bit1Test.TestTitle: shortstring;
  122. begin
  123. Result := 'Unsigned 64-bit division by 1';
  124. end;
  125. function TUInt64Bit1Test.GetDivisor: QWord;
  126. begin
  127. Result := 1;
  128. end;
  129. procedure TUInt64Bit1Test.DoTestIteration(Iteration: Integer);
  130. var
  131. Numerator, Answer: QWord;
  132. Index, X: Integer;
  133. begin
  134. Index := Iteration and $FF;
  135. case Index of
  136. 253:
  137. Numerator := QWord($FFFFFFFFFFFFFFFD);
  138. 254:
  139. Numerator := QWord($FFFFFFFFFFFFFFFE);
  140. 255:
  141. Numerator := QWord($FFFFFFFFFFFFFFFF);
  142. else
  143. Numerator := QWord(Index);
  144. end;
  145. FInputArray[Index] := Numerator;
  146. for X := 0 to INTERNAL_LOOPS - 1 do
  147. Answer := Numerator div 1;
  148. FResultArray[Index] := Answer;
  149. end;
  150. { TUInt64Bit1ModTest }
  151. function TUInt64Bit1ModTest.TestTitle: shortstring;
  152. begin
  153. Result := 'Unsigned 64-bit modulus by 1';
  154. end;
  155. function TUInt64Bit1ModTest.GetDivisor: QWord;
  156. begin
  157. Result := 1;
  158. end;
  159. procedure TUInt64Bit1ModTest.DoTestIteration(Iteration: Integer);
  160. var
  161. Numerator, Answer: QWord;
  162. Index, X: Integer;
  163. begin
  164. Index := Iteration and $FF;
  165. case Index of
  166. 253:
  167. Numerator := QWord($FFFFFFFFFFFFFFFD);
  168. 254:
  169. Numerator := QWord($FFFFFFFFFFFFFFFE);
  170. 255:
  171. Numerator := QWord($FFFFFFFFFFFFFFFF);
  172. else
  173. Numerator := QWord(Index);
  174. end;
  175. FInputArray[Index] := Numerator;
  176. for X := 0 to INTERNAL_LOOPS - 1 do
  177. Answer := Numerator mod 1;
  178. FResultArray[Index] := Answer;
  179. end;
  180. { TUInt64Bit2Test }
  181. function TUInt64Bit2Test.TestTitle: shortstring;
  182. begin
  183. Result := 'Unsigned 64-bit division by 2';
  184. end;
  185. function TUInt64Bit2Test.GetDivisor: QWord;
  186. begin
  187. Result := 2;
  188. end;
  189. procedure TUInt64Bit2Test.DoTestIteration(Iteration: Integer);
  190. var
  191. Numerator, Answer: QWord;
  192. Index, X: Integer;
  193. begin
  194. Index := Iteration and $FF;
  195. case Index of
  196. 253:
  197. Numerator := QWord($FFFFFFFFFFFFFFFD);
  198. 254:
  199. Numerator := QWord($FFFFFFFFFFFFFFFE);
  200. 255:
  201. Numerator := QWord($FFFFFFFFFFFFFFFF);
  202. else
  203. Numerator := QWord(Index);
  204. end;
  205. FInputArray[Index] := Numerator;
  206. for X := 0 to INTERNAL_LOOPS - 1 do
  207. Answer := Numerator div 2;
  208. FResultArray[Index] := Answer;
  209. end;
  210. { TUInt64Bit2ModTest }
  211. function TUInt64Bit2ModTest.TestTitle: shortstring;
  212. begin
  213. Result := 'Unsigned 64-bit modulus by 2';
  214. end;
  215. function TUInt64Bit2ModTest.GetDivisor: QWord;
  216. begin
  217. Result := 2;
  218. end;
  219. procedure TUInt64Bit2ModTest.DoTestIteration(Iteration: Integer);
  220. var
  221. Numerator, Answer: QWord;
  222. Index, X: Integer;
  223. begin
  224. Index := Iteration and $FF;
  225. case Index of
  226. 253:
  227. Numerator := QWord($FFFFFFFFFFFFFFFD);
  228. 254:
  229. Numerator := QWord($FFFFFFFFFFFFFFFE);
  230. 255:
  231. Numerator := QWord($FFFFFFFFFFFFFFFF);
  232. else
  233. Numerator := QWord(Index);
  234. end;
  235. FInputArray[Index] := Numerator;
  236. for X := 0 to INTERNAL_LOOPS - 1 do
  237. Answer := Numerator mod 2;
  238. FResultArray[Index] := Answer;
  239. end;
  240. { TUInt64Bit3Test }
  241. function TUInt64Bit3Test.TestTitle: shortstring;
  242. begin
  243. Result := 'Unsigned 64-bit division by 3';
  244. end;
  245. function TUInt64Bit3Test.GetDivisor: QWord;
  246. begin
  247. Result := 3;
  248. end;
  249. procedure TUInt64Bit3Test.DoTestIteration(Iteration: Integer);
  250. var
  251. Numerator, Answer: QWord;
  252. Index, X: Integer;
  253. begin
  254. Index := Iteration and $FF;
  255. case Index of
  256. 254:
  257. Numerator := QWord($FFFFFFFFFFFFFFFE);
  258. 255:
  259. Numerator := QWord($FFFFFFFFFFFFFFFF);
  260. else
  261. Numerator := QWord(Index);
  262. end;
  263. FInputArray[Index] := Numerator;
  264. for X := 0 to INTERNAL_LOOPS - 1 do
  265. Answer := Numerator div 3;
  266. FResultArray[Index] := Answer;
  267. end;
  268. { TUInt64Bit3ModTest }
  269. function TUInt64Bit3ModTest.TestTitle: shortstring;
  270. begin
  271. Result := 'Unsigned 64-bit modulus by 3';
  272. end;
  273. function TUInt64Bit3ModTest.GetDivisor: QWord;
  274. begin
  275. Result := 3;
  276. end;
  277. procedure TUInt64Bit3ModTest.DoTestIteration(Iteration: Integer);
  278. var
  279. Numerator, Answer: QWord;
  280. Index, X: Integer;
  281. begin
  282. Index := Iteration and $FF;
  283. case Index of
  284. 254:
  285. Numerator := QWord($FFFFFFFFFFFFFFFE);
  286. 255:
  287. Numerator := QWord($FFFFFFFFFFFFFFFF);
  288. else
  289. Numerator := QWord(Index);
  290. end;
  291. FInputArray[Index] := Numerator;
  292. for X := 0 to INTERNAL_LOOPS - 1 do
  293. Answer := Numerator mod 3;
  294. FResultArray[Index] := Answer;
  295. end;
  296. { TUInt64Bit7Test }
  297. function TUInt64Bit7Test.TestTitle: shortstring;
  298. begin
  299. Result := 'Unsigned 64-bit division by 7';
  300. end;
  301. function TUInt64Bit7Test.GetDivisor: QWord;
  302. begin
  303. Result := 7;
  304. end;
  305. procedure TUInt64Bit7Test.DoTestIteration(Iteration: Integer);
  306. var
  307. Numerator, Answer: QWord;
  308. Index, X: Integer;
  309. begin
  310. Index := Iteration and $FF;
  311. case Index of
  312. 253:
  313. Numerator := QWord($FFFFFFFFFFFFFFFD);
  314. 254:
  315. Numerator := QWord($FFFFFFFFFFFFFFFE);
  316. 255:
  317. Numerator := QWord($FFFFFFFFFFFFFFFF);
  318. else
  319. Numerator := QWord(Index);
  320. end;
  321. FInputArray[Index] := Numerator;
  322. for X := 0 to INTERNAL_LOOPS - 1 do
  323. Answer := Numerator div 7;
  324. FResultArray[Index] := Answer;
  325. end;
  326. { TUInt64Bit7ModTest }
  327. function TUInt64Bit7ModTest.TestTitle: shortstring;
  328. begin
  329. Result := 'Unsigned 64-bit modulus by 7';
  330. end;
  331. function TUInt64Bit7ModTest.GetDivisor: QWord;
  332. begin
  333. Result := 7;
  334. end;
  335. procedure TUInt64Bit7ModTest.DoTestIteration(Iteration: Integer);
  336. var
  337. Numerator, Answer: QWord;
  338. Index, X: Integer;
  339. begin
  340. Index := Iteration and $FF;
  341. case Index of
  342. 253:
  343. Numerator := QWord($FFFFFFFFFFFFFFFD);
  344. 254:
  345. Numerator := QWord($FFFFFFFFFFFFFFFE);
  346. 255:
  347. Numerator := QWord($FFFFFFFFFFFFFFFF);
  348. else
  349. Numerator := QWord(Index);
  350. end;
  351. FInputArray[Index] := Numerator;
  352. for X := 0 to INTERNAL_LOOPS - 1 do
  353. Answer := Numerator mod 7;
  354. FResultArray[Index] := Answer;
  355. end;
  356. { TUInt64Bit10Test }
  357. function TUInt64Bit10Test.TestTitle: shortstring;
  358. begin
  359. Result := 'Unsigned 64-bit division by 10';
  360. end;
  361. function TUInt64Bit10Test.GetDivisor: QWord;
  362. begin
  363. Result := 10;
  364. end;
  365. procedure TUInt64Bit10Test.DoTestIteration(Iteration: Integer);
  366. var
  367. Numerator, Answer: QWord;
  368. Index, X: Integer;
  369. begin
  370. Index := Iteration and $FF;
  371. case Index of
  372. 253:
  373. Numerator := QWord($FFFFFFFFFFFFFFF9);
  374. 254:
  375. Numerator := QWord($FFFFFFFFFFFFFFFA);
  376. 255:
  377. Numerator := QWord($FFFFFFFFFFFFFFFF);
  378. else
  379. Numerator := QWord(Index);
  380. end;
  381. FInputArray[Index] := Numerator;
  382. for X := 0 to INTERNAL_LOOPS - 1 do
  383. Answer := Numerator div 10;
  384. FResultArray[Index] := Answer;
  385. end;
  386. { TUInt64Bit10ModTest }
  387. function TUInt64Bit10ModTest.TestTitle: shortstring;
  388. begin
  389. Result := 'Unsigned 64-bit modulus by 10';
  390. end;
  391. function TUInt64Bit10ModTest.GetDivisor: QWord;
  392. begin
  393. Result := 10;
  394. end;
  395. procedure TUInt64Bit10ModTest.DoTestIteration(Iteration: Integer);
  396. var
  397. Numerator, Answer: QWord;
  398. Index, X: Integer;
  399. begin
  400. Index := Iteration and $FF;
  401. case Index of
  402. 252:
  403. Numerator := QWord($FFFFFFFFFFFFFFEF);
  404. 253:
  405. Numerator := QWord($FFFFFFFFFFFFFFF0);
  406. 254:
  407. Numerator := QWord($FFFFFFFFFFFFFFF1);
  408. 255:
  409. Numerator := QWord($FFFFFFFFFFFFFFFF);
  410. else
  411. Numerator := QWord(Index);
  412. end;
  413. FInputArray[Index] := Numerator;
  414. for X := 0 to INTERNAL_LOOPS - 1 do
  415. Answer := Numerator mod 10;
  416. FResultArray[Index] := Answer;
  417. end;
  418. { TUInt64Bit100Test }
  419. function TUInt64Bit100Test.TestTitle: shortstring;
  420. begin
  421. Result := 'Unsigned 64-bit division by 100';
  422. end;
  423. function TUInt64Bit100Test.GetDivisor: QWord;
  424. begin
  425. Result := 100;
  426. end;
  427. procedure TUInt64Bit100Test.DoTestIteration(Iteration: Integer);
  428. var
  429. Numerator, Answer: QWord;
  430. Index, X: Integer;
  431. begin
  432. Index := Iteration and $FF;
  433. case Index of
  434. 252:
  435. Numerator := QWord($FFFFFFFFFFFFFFEF);
  436. 253:
  437. Numerator := QWord($FFFFFFFFFFFFFFF0);
  438. 254:
  439. Numerator := QWord($FFFFFFFFFFFFFFF1);
  440. 255:
  441. Numerator := QWord($FFFFFFFFFFFFFFFF);
  442. else
  443. Numerator := Cardinal(Index);
  444. end;
  445. FInputArray[Index] := Numerator;
  446. for X := 0 to INTERNAL_LOOPS - 1 do
  447. Answer := Numerator div 100;
  448. FResultArray[Index] := Answer;
  449. end;
  450. { TUInt64Bit100ModTest }
  451. function TUInt64Bit100ModTest.TestTitle: shortstring;
  452. begin
  453. Result := 'Unsigned 64-bit modulus by 100';
  454. end;
  455. function TUInt64Bit100ModTest.GetDivisor: QWord;
  456. begin
  457. Result := 100;
  458. end;
  459. procedure TUInt64Bit100ModTest.DoTestIteration(Iteration: Integer);
  460. var
  461. Numerator, Answer: QWord;
  462. Index, X: Integer;
  463. begin
  464. Index := Iteration and $FF;
  465. case Index of
  466. 252:
  467. Numerator := QWord($FFFFFFFFFFFFFFEF);
  468. 253:
  469. Numerator := QWord($FFFFFFFFFFFFFFF0);
  470. 254:
  471. Numerator := QWord($FFFFFFFFFFFFFFF1);
  472. 255:
  473. Numerator := QWord($FFFFFFFFFFFFFFFF);
  474. else
  475. Numerator := Cardinal(Index);
  476. end;
  477. FInputArray[Index] := Numerator;
  478. for X := 0 to INTERNAL_LOOPS - 1 do
  479. Answer := Numerator mod 100;
  480. FResultArray[Index] := Answer;
  481. end;
  482. { TUInt64Bit1000000000Test }
  483. function TUInt64Bit1000000000Test.TestTitle: shortstring;
  484. begin
  485. Result := 'Unsigned 64-bit division by 1,000,000,000';
  486. end;
  487. function TUInt64Bit1000000000Test.GetDivisor: QWord;
  488. begin
  489. Result := 1000000000;
  490. end;
  491. procedure TUInt64Bit1000000000Test.DoTestIteration(Iteration: Integer);
  492. var
  493. Numerator, Answer: QWord;
  494. Index, X: Integer;
  495. begin
  496. Index := Iteration and $FF;
  497. Numerator := FU64_1000000000Input[Index and $F];
  498. FInputArray[Index] := Numerator;
  499. for X := 0 to INTERNAL_LOOPS - 1 do
  500. Answer := Numerator div 1000000000;
  501. FResultArray[Index] := Answer;
  502. end;
  503. { TUInt64Bit1000000000ModTest }
  504. function TUInt64Bit1000000000ModTest.TestTitle: shortstring;
  505. begin
  506. Result := 'Unsigned 64-bit modulus by 1,000,000,000';
  507. end;
  508. function TUInt64Bit1000000000ModTest.GetDivisor: QWord;
  509. begin
  510. Result := 1000000000;
  511. end;
  512. procedure TUInt64Bit1000000000ModTest.DoTestIteration(Iteration: Integer);
  513. var
  514. Numerator, Answer: QWord;
  515. Index, X: Integer;
  516. begin
  517. Index := Iteration and $FF;
  518. Numerator := FU64_1000000000Input[Index and $F];
  519. FInputArray[Index] := Numerator;
  520. for X := 0 to INTERNAL_LOOPS - 1 do
  521. Answer := Numerator mod 1000000000;
  522. FResultArray[Index] := Answer;
  523. end;