Changeset 98510 in vbox
- Timestamp:
- Feb 8, 2023 9:30:49 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 155778
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/testcase/tstRTNoCrt-5.cpp
r98496 r98510 48 48 * Defined Constants And Macros * 49 49 *********************************************************************************************************************************/ 50 #define RANDOM_LOOPS _256K 50 #ifdef DEBUG 51 # define RANDOM_LOOPS _256K 52 #else 53 # define RANDOM_LOOPS _1M 54 #endif 51 55 52 56 … … 70 74 { 71 75 uint64_t uDividend, uDivisor; 72 uint64_t uQuotient, uRem inder;76 uint64_t uQuotient, uRemainder; 73 77 } TSTRTNOCRT5DIV; 74 78 … … 361 365 { UINT64_C(0xdf8305930df94306), UINT64_C(0x00000043d9dfa039), /* => */ UINT64_C(0x00000000034B4D9D), UINT64_C(0x0000000990EFDB11) }, 362 366 { UINT64_C(0xff9f939d0f0302d9), UINT64_C(0x0000000000000042), /* => */ UINT64_C(0x03DF823C8FBE1B31), UINT64_C(0x0000000000000037) }, 367 { UINT64_C(0xffffffffffffffff), UINT64_C(0x0000000000000042), /* => */ UINT64_C(0x03E0F83E0F83E0F8), UINT64_C(0x000000000000000f) }, 368 { UINT64_C(0xffffffffffffffff), UINT64_C(0x0000000000000007), /* => */ UINT64_C(0x2492492492492492), UINT64_C(0x0000000000000001) }, 369 { UINT64_C(0xe1f17ac834b412b4), UINT64_C(0xda38027453291b1e), /* => */ UINT64_C(0x0000000000000001), UINT64_C(0x07b97853e18af796) }, 370 /* These should trigger the rare overflow condition in the 32-bit approximation algorithm. */ 371 { UINT64_C(0xe101721f65eb6226), UINT64_C(0x0000028180a483fa), /* => */ UINT64_C(0x000000000059CA9C), UINT64_C(0x000002814F9DB1CE) }, 372 { UINT64_C(0x8b0a3ed1cda21100), UINT64_C(0x8b0a3ed1cda231d4), /* => */ UINT64_C(0x0000000000000000), UINT64_C(0x8B0A3ED1CDA21100) }, 373 { UINT64_C(0xf1387d27f3a0c583), UINT64_C(0x000735f0d9661f93), /* => */ UINT64_C(0x0000000000002173), UINT64_C(0x000735F020AEA37A) }, 374 { UINT64_C(0xb690b755d6f4496f), UINT64_C(0x000143027675d0d7), /* => */ UINT64_C(0x00000000000090b0), UINT64_C(0x00014302207bc59f) }, 375 { UINT64_C(0x78a5b3efc6c82cf7), UINT64_C(0x00000f9b4400a9f0), /* => */ UINT64_C(0x000000000007bb06), UINT64_C(0x00000f9b0d11e157) }, 376 { UINT64_C(0x8ae75b071b094efc), UINT64_C(0x0020904259dedd1e), /* => */ UINT64_C(0x0000000000000443), UINT64_C(0x002090421a40f822) }, 377 { UINT64_C(0x90c9fb203c85fa7c), UINT64_C(0x000001ef807ef1e9), /* => */ UINT64_C(0x00000000004ace0e), UINT64_C(0x000001ef219141be) }, 378 { UINT64_C(0xf9ae8ea6b31751df), UINT64_C(0x00004281110e2327), /* => */ UINT64_C(0x000000000003c11e), UINT64_C(0x00004280a179cc4d) }, 379 /* These trigger an even more special case, where the QapproxDividend calculation overflows. */ 380 { UINT64_C(0xffffffffffffffff), UINT64_C(0x00003C11D54B525f), /* => */ UINT64_C(0x00000000000442FF), UINT64_C(0x00003C11D540755E) }, 381 { UINT64_C(0xfffffffffefa1235), UINT64_C(0x0001001702112f8c), /* => */ UINT64_C(0x000000000000FFE8), UINT64_C(0x00010017010A8755) }, 363 382 }; 364 383 … … 380 399 { 381 400 uint64_t const uResult = g_aDivU[i].uDividend % g_aDivU[i].uDivisor; /* aullrem */ 382 if (uResult != g_aDivU[i].uRem inder)401 if (uResult != g_aDivU[i].uRemainder) 383 402 RTTestFailed(g_hTest, "i=%u %#018RX64 %% %#018RX64 => %#018RX64, expected %#018RX64", 384 i, g_aDivU[i].uDividend, g_aDivU[i].uDivisor, uResult, g_aDivU[i].uRem inder);403 i, g_aDivU[i].uDividend, g_aDivU[i].uDivisor, uResult, g_aDivU[i].uRemainder); 385 404 } 386 405 for (size_t i = 0; i < RT_ELEMENTS(g_aDivU); i++) 387 406 { 388 uint64_t const uDividend = g_aDivU[i].uDividend;389 uint64_t const uDivisor = g_aDivU[i].uDivisor;390 uint64_t const uQuotient = uDividend / uDivisor; /* auldvrm hopefully - only not in unoptimized builds. */391 uint64_t const uRem inder = uDividend % uDivisor;392 if ( uQuotient != g_aDivU[i].uQuotient393 || uRem inder != g_aDivU[i].uReminder)407 uint64_t const uDividend = g_aDivU[i].uDividend; 408 uint64_t const uDivisor = g_aDivU[i].uDivisor; 409 uint64_t const uQuotient = uDividend / uDivisor; /* auldvrm hopefully - only not in unoptimized builds. */ 410 uint64_t const uRemainder = uDividend % uDivisor; 411 if ( uQuotient != g_aDivU[i].uQuotient 412 || uRemainder != g_aDivU[i].uRemainder) 394 413 RTTestFailed(g_hTest, "i=%u %#018RX64 / %#018RX64 => q=%#018RX64 r=%#018RX64, expected q=%#018RX64 r=%#018RX64", 395 414 i, g_aDivU[i].uDividend, g_aDivU[i].uDivisor, 396 uQuotient, uRem inder, g_aDivU[i].uQuotient, g_aDivU[i].uReminder);415 uQuotient, uRemainder, g_aDivU[i].uQuotient, g_aDivU[i].uRemainder); 397 416 } 398 417 … … 420 439 RTTestFailed(g_hTest, "%#018RX64 %% %#018RX64 => %#018RX64, expected %#018RX64", uDividend.u, uDivisor.u, uResult, uExpected.u); 421 440 } 422 for ( size_t i = 0; i < RANDOM_LOOPS; i++)423 { 424 RTUINT64U const uDividend = { RTRandU64Ex(0, i & 7 ? UINT64_MAX : UINT32_MAX) };425 RTUINT64U const uDivisor = { RTRandU64Ex(0, i & 3 ? UINT64_MAX : UINT32_MAX) };426 uint64_t const uRem inder = uDividend.u % uDivisor.u;427 uint64_t const uQuotient = uDividend.u / uDivisor.u;441 for (uint64_t i = 0; i < RANDOM_LOOPS; i++) 442 { 443 RTUINT64U const uDividend = { RTRandU64Ex(0, i & 7 ? UINT64_MAX : UINT32_MAX) }; 444 RTUINT64U const uDivisor = { RTRandU64Ex(0, i & 3 ? UINT64_MAX : UINT32_MAX) }; 445 uint64_t const uRemainder = uDividend.u % uDivisor.u; 446 uint64_t const uQuotient = uDividend.u / uDivisor.u; 428 447 RTUINT64U uExpectedQ, uExpectedR; 429 448 RTUInt64DivRem(&uExpectedQ, &uExpectedR, &uDividend, &uDivisor); 430 if ( uQuotient != uExpectedQ.u431 || uRem inder != uExpectedR.u)449 if ( uQuotient != uExpectedQ.u 450 || uRemainder != uExpectedR.u) 432 451 RTTestFailed(g_hTest, "%#018RX64 / %#018RX64 => q=%#018RX64 r=%#018RX64, expected q=%#018RX64 r=%#018RX64", 433 uDividend.u, uDivisor.u, uQuotient, uRem inder, uExpectedQ.u, uExpectedR.u);452 uDividend.u, uDivisor.u, uQuotient, uRemainder, uExpectedQ.u, uExpectedR.u); 434 453 } 435 454 } … … 452 471 { UINT64_C(0x0000000000000003), UINT64_C(0xfffffffffffffffe), /* => */ UINT64_C(0xffffffffffffffff), UINT64_C(0x0000000000000001) }, 453 472 { UINT64_C(0xfffffffffffffffd), UINT64_C(0xfffffffffffffffe), /* => */ UINT64_C(0x0000000000000001), UINT64_C(0xffffffffffffffff) }, 473 474 { UINT64_C(0x8000000000000001), UINT64_C(0x0000000000000001), /* => */ UINT64_C(0x8000000000000001), UINT64_C(0x0000000000000000) }, 475 { UINT64_C(0x8000000000000001), UINT64_C(0x0000000000000002), /* => */ UINT64_C(0xc000000000000001), UINT64_C(0xffffffffffffffff) }, 476 { UINT64_C(0x8000000000000001), UINT64_C(0x0000000000000002), /* => */ UINT64_C(0xc000000000000001), UINT64_C(0xffffffffffffffff) }, 477 478 { UINT64_C(0x8000000000000000), UINT64_C(0x0000000000000001), /* => */ UINT64_C(0x8000000000000000), UINT64_C(0x0000000000000000) }, 479 { UINT64_C(0x8000000000000000), UINT64_C(0x0000000000000002), /* => */ UINT64_C(0xc000000000000000), UINT64_C(0x0000000000000000) }, 480 { UINT64_C(0x8000000000000000), UINT64_C(0xffffffffffffffff), /* => */ UINT64_C(0x8000000000000000), UINT64_C(0x0000000000000000) }, 481 { UINT64_C(0x8000000000000000), UINT64_C(0xfffffffffffffffe), /* => */ UINT64_C(0x4000000000000000), UINT64_C(0x0000000000000000) }, 454 482 }; 455 483 … … 471 499 { 472 500 int64_t const iResult = (int64_t)g_aDivS[i].uDividend % (int64_t)g_aDivS[i].uDivisor; /* aullrem */ 473 if ((uint64_t)iResult != g_aDivS[i].uRem inder)501 if ((uint64_t)iResult != g_aDivS[i].uRemainder) 474 502 RTTestFailed(g_hTest, "i=%u %#018RX64 %% %#018RX64 => %#018RX64, expected %#018RX64", 475 i, g_aDivS[i].uDividend, g_aDivS[i].uDivisor, iResult, g_aDivS[i].uRem inder);503 i, g_aDivS[i].uDividend, g_aDivS[i].uDivisor, iResult, g_aDivS[i].uRemainder); 476 504 } 477 505 for (size_t i = 0; i < RT_ELEMENTS(g_aDivS); i++) 478 506 { 479 int64_t const iDividend = (int64_t)g_aDivS[i].uDividend;480 int64_t const iDivisor = (int64_t)g_aDivS[i].uDivisor;481 int64_t const iQuotient = iDividend / iDivisor; /* auldvrm hopefully - only not in unoptimized builds. */482 int64_t const iRem inder = iDividend % iDivisor;483 if ( (uint64_t)iQuotient != g_aDivS[i].uQuotient484 || (uint64_t)iRem inder != g_aDivS[i].uReminder)507 int64_t const iDividend = (int64_t)g_aDivS[i].uDividend; 508 int64_t const iDivisor = (int64_t)g_aDivS[i].uDivisor; 509 int64_t const iQuotient = iDividend / iDivisor; /* auldvrm hopefully - only not in unoptimized builds. */ 510 int64_t const iRemainder = iDividend % iDivisor; 511 if ( (uint64_t)iQuotient != g_aDivS[i].uQuotient 512 || (uint64_t)iRemainder != g_aDivS[i].uRemainder) 485 513 RTTestFailed(g_hTest, "i=%u %#018RX64 / %#018RX64 => q=%#018RX64 r=%#018RX64, expected q=%#018RX64 r=%#018RX64", 486 514 i, g_aDivS[i].uDividend, g_aDivS[i].uDivisor, 487 iQuotient, iRem inder, g_aDivS[i].uQuotient, g_aDivS[i].uReminder);515 iQuotient, iRemainder, g_aDivS[i].uQuotient, g_aDivS[i].uRemainder); 488 516 } 489 517 … … 523 551 for (size_t i = 0; i < RANDOM_LOOPS; i++) 524 552 { 525 RTUINT64U const uDividend = { RTRandU64Ex(0, i & 7 ? UINT64_MAX : UINT32_MAX) };526 RTUINT64U const uDivisor = { RTRandU64Ex(1, i & 3 ? UINT64_MAX : UINT32_MAX) };527 int64_t const iRem inder = (int64_t)uDividend.u % (int64_t)uDivisor.u;528 int64_t const iQuotient = (int64_t)uDividend.u / (int64_t)uDivisor.u;553 RTUINT64U const uDividend = { RTRandU64Ex(0, i & 7 ? UINT64_MAX : UINT32_MAX) }; 554 RTUINT64U const uDivisor = { RTRandU64Ex(1, i & 3 ? UINT64_MAX : UINT32_MAX) }; 555 int64_t const iRemainder = (int64_t)uDividend.u % (int64_t)uDivisor.u; 556 int64_t const iQuotient = (int64_t)uDividend.u / (int64_t)uDivisor.u; 529 557 RTUINT64U uExpectedQ, uExpectedR; 530 558 RTUInt64DivRemSigned(&uExpectedQ, &uExpectedR, &uDividend, &uDivisor); 531 if ( (uint64_t)iQuotient != uExpectedQ.u532 || (uint64_t)iRem inder != uExpectedR.u)559 if ( (uint64_t)iQuotient != uExpectedQ.u 560 || (uint64_t)iRemainder != uExpectedR.u) 533 561 RTTestFailed(g_hTest, "%#018RX64 / %#018RX64 => q=%#018RX64 r=%#018RX64, expected q=%#018RX64 r=%#018RX64", 534 uDividend.u, uDivisor.u, iQuotient, iRem inder, uExpectedQ.u, uExpectedR.u);562 uDividend.u, uDivisor.u, iQuotient, iRemainder, uExpectedQ.u, uExpectedR.u); 535 563 } 536 564 }
Note:
See TracChangeset
for help on using the changeset viewer.