bdiv_u64.inc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  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. { TUInt64Bit5Test }
  51. TUInt64Bit5Test = 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. { TUInt64Bit5ModTest }
  59. TUInt64Bit5ModTest = 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. { TUInt64Bit5Test }
  297. function TUInt64Bit5Test.TestTitle: shortstring;
  298. begin
  299. Result := 'Unsigned 64-bit division by 5';
  300. end;
  301. function TUInt64Bit5Test.GetDivisor: QWord;
  302. begin
  303. Result := 5;
  304. end;
  305. procedure TUInt64Bit5Test.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. 254:
  313. Numerator := QWord($FFFFFFFFFFFFFFFE);
  314. 255:
  315. Numerator := QWord($FFFFFFFFFFFFFFFF);
  316. else
  317. Numerator := QWord(Index);
  318. end;
  319. FInputArray[Index] := Numerator;
  320. for X := 0 to INTERNAL_LOOPS - 1 do
  321. Answer := Numerator div 5;
  322. FResultArray[Index] := Answer;
  323. end;
  324. { TUInt64Bit5ModTest }
  325. function TUInt64Bit5ModTest.TestTitle: shortstring;
  326. begin
  327. Result := 'Unsigned 64-bit modulus by 5';
  328. end;
  329. function TUInt64Bit5ModTest.GetDivisor: QWord;
  330. begin
  331. Result := 5;
  332. end;
  333. procedure TUInt64Bit5ModTest.DoTestIteration(Iteration: Integer);
  334. var
  335. Numerator, Answer: QWord;
  336. Index, X: Integer;
  337. begin
  338. Index := Iteration and $FF;
  339. case Index of
  340. 254:
  341. Numerator := QWord($FFFFFFFFFFFFFFFE);
  342. 255:
  343. Numerator := QWord($FFFFFFFFFFFFFFFF);
  344. else
  345. Numerator := QWord(Index);
  346. end;
  347. FInputArray[Index] := Numerator;
  348. for X := 0 to INTERNAL_LOOPS - 1 do
  349. Answer := Numerator mod 5;
  350. FResultArray[Index] := Answer;
  351. end;
  352. { TUInt64Bit10Test }
  353. function TUInt64Bit10Test.TestTitle: shortstring;
  354. begin
  355. Result := 'Unsigned 64-bit division by 10';
  356. end;
  357. function TUInt64Bit10Test.GetDivisor: QWord;
  358. begin
  359. Result := 10;
  360. end;
  361. procedure TUInt64Bit10Test.DoTestIteration(Iteration: Integer);
  362. var
  363. Numerator, Answer: QWord;
  364. Index, X: Integer;
  365. begin
  366. Index := Iteration and $FF;
  367. case Index of
  368. 253:
  369. Numerator := QWord($FFFFFFFFFFFFFFF9);
  370. 254:
  371. Numerator := QWord($FFFFFFFFFFFFFFFA);
  372. 255:
  373. Numerator := QWord($FFFFFFFFFFFFFFFF);
  374. else
  375. Numerator := QWord(Index);
  376. end;
  377. FInputArray[Index] := Numerator;
  378. for X := 0 to INTERNAL_LOOPS - 1 do
  379. Answer := Numerator div 10;
  380. FResultArray[Index] := Answer;
  381. end;
  382. { TUInt64Bit10ModTest }
  383. function TUInt64Bit10ModTest.TestTitle: shortstring;
  384. begin
  385. Result := 'Unsigned 64-bit modulus by 10';
  386. end;
  387. function TUInt64Bit10ModTest.GetDivisor: QWord;
  388. begin
  389. Result := 10;
  390. end;
  391. procedure TUInt64Bit10ModTest.DoTestIteration(Iteration: Integer);
  392. var
  393. Numerator, Answer: QWord;
  394. Index, X: Integer;
  395. begin
  396. Index := Iteration and $FF;
  397. case Index of
  398. 253:
  399. Numerator := QWord($FFFFFFFFFFFFFFF9);
  400. 254:
  401. Numerator := QWord($FFFFFFFFFFFFFFFA);
  402. 255:
  403. Numerator := QWord($FFFFFFFFFFFFFFFF);
  404. else
  405. Numerator := QWord(Index);
  406. end;
  407. FInputArray[Index] := Numerator;
  408. for X := 0 to INTERNAL_LOOPS - 1 do
  409. Answer := Numerator mod 10;
  410. FResultArray[Index] := Answer;
  411. end;
  412. { TUInt64Bit100Test }
  413. function TUInt64Bit100Test.TestTitle: shortstring;
  414. begin
  415. Result := 'Unsigned 64-bit division by 100';
  416. end;
  417. function TUInt64Bit100Test.GetDivisor: QWord;
  418. begin
  419. Result := 100;
  420. end;
  421. procedure TUInt64Bit100Test.DoTestIteration(Iteration: Integer);
  422. var
  423. Numerator, Answer: QWord;
  424. Index, X: Integer;
  425. begin
  426. Index := Iteration and $FF;
  427. case Index of
  428. 253:
  429. Numerator := QWord($FFFFFFFFFFFFFFEF);
  430. 254:
  431. Numerator := QWord($FFFFFFFFFFFFFFF0);
  432. 255:
  433. Numerator := QWord($FFFFFFFFFFFFFFFF);
  434. else
  435. Numerator := Cardinal(Index);
  436. end;
  437. FInputArray[Index] := Numerator;
  438. for X := 0 to INTERNAL_LOOPS - 1 do
  439. Answer := Numerator div 100;
  440. FResultArray[Index] := Answer;
  441. end;
  442. { TUInt64Bit100ModTest }
  443. function TUInt64Bit100ModTest.TestTitle: shortstring;
  444. begin
  445. Result := 'Unsigned 64-bit modulus by 100';
  446. end;
  447. function TUInt64Bit100ModTest.GetDivisor: QWord;
  448. begin
  449. Result := 100;
  450. end;
  451. procedure TUInt64Bit100ModTest.DoTestIteration(Iteration: Integer);
  452. var
  453. Numerator, Answer: QWord;
  454. Index, X: Integer;
  455. begin
  456. Index := Iteration and $FF;
  457. case Index of
  458. 253:
  459. Numerator := QWord($FFFFFFFFFFFFFFEF);
  460. 254:
  461. Numerator := QWord($FFFFFFFFFFFFFFF0);
  462. 255:
  463. Numerator := QWord($FFFFFFFFFFFFFFFF);
  464. else
  465. Numerator := Cardinal(Index);
  466. end;
  467. FInputArray[Index] := Numerator;
  468. for X := 0 to INTERNAL_LOOPS - 1 do
  469. Answer := Numerator mod 100;
  470. FResultArray[Index] := Answer;
  471. end;
  472. { TUInt64Bit1000000000Test }
  473. function TUInt64Bit1000000000Test.TestTitle: shortstring;
  474. begin
  475. Result := 'Unsigned 64-bit division by 1,000,000,000';
  476. end;
  477. function TUInt64Bit1000000000Test.GetDivisor: QWord;
  478. begin
  479. Result := 1000000000;
  480. end;
  481. procedure TUInt64Bit1000000000Test.DoTestIteration(Iteration: Integer);
  482. var
  483. Numerator, Answer: QWord;
  484. Index, X: Integer;
  485. begin
  486. Index := Iteration and $FF;
  487. Numerator := FU64_1000000000Input[Index and $F];
  488. FInputArray[Index] := Numerator;
  489. for X := 0 to INTERNAL_LOOPS - 1 do
  490. Answer := Numerator div 1000000000;
  491. FResultArray[Index] := Answer;
  492. end;
  493. { TUInt64Bit1000000000ModTest }
  494. function TUInt64Bit1000000000ModTest.TestTitle: shortstring;
  495. begin
  496. Result := 'Unsigned 64-bit modulus by 1,000,000,000';
  497. end;
  498. function TUInt64Bit1000000000ModTest.GetDivisor: QWord;
  499. begin
  500. Result := 1000000000;
  501. end;
  502. procedure TUInt64Bit1000000000ModTest.DoTestIteration(Iteration: Integer);
  503. var
  504. Numerator, Answer: QWord;
  505. Index, X: Integer;
  506. begin
  507. Index := Iteration and $FF;
  508. Numerator := FU64_1000000000Input[Index and $F];
  509. FInputArray[Index] := Numerator;
  510. for X := 0 to INTERNAL_LOOPS - 1 do
  511. Answer := Numerator mod 1000000000;
  512. FResultArray[Index] := Answer;
  513. end;