VirtualBox

Changeset 98510 in vbox


Ignore:
Timestamp:
Feb 8, 2023 9:30:49 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
155778
Message:

IPRT/vcc: Cover some more corner cases in tstRTNoCrt-5.cpp udiv. bugref:10261

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/tstRTNoCrt-5.cpp

    r98496 r98510  
    4848*   Defined Constants And Macros                                                                                                 *
    4949*********************************************************************************************************************************/
    50 #define RANDOM_LOOPS        _256K
     50#ifdef DEBUG
     51# define RANDOM_LOOPS        _256K
     52#else
     53# define RANDOM_LOOPS        _1M
     54#endif
    5155
    5256
     
    7074{
    7175    uint64_t    uDividend, uDivisor;
    72     uint64_t    uQuotient, uReminder;
     76    uint64_t    uQuotient, uRemainder;
    7377} TSTRTNOCRT5DIV;
    7478
     
    361365    { UINT64_C(0xdf8305930df94306), UINT64_C(0x00000043d9dfa039), /* => */ UINT64_C(0x00000000034B4D9D), UINT64_C(0x0000000990EFDB11) },
    362366    { 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) },
    363382};
    364383
     
    380399    {
    381400        uint64_t const uResult = g_aDivU[i].uDividend % g_aDivU[i].uDivisor; /* aullrem */
    382         if (uResult != g_aDivU[i].uReminder)
     401        if (uResult != g_aDivU[i].uRemainder)
    383402            RTTestFailed(g_hTest, "i=%u %#018RX64 %% %#018RX64 => %#018RX64, expected %#018RX64",
    384                          i, g_aDivU[i].uDividend, g_aDivU[i].uDivisor, uResult, g_aDivU[i].uReminder);
     403                         i, g_aDivU[i].uDividend, g_aDivU[i].uDivisor, uResult, g_aDivU[i].uRemainder);
    385404    }
    386405    for (size_t i = 0; i < RT_ELEMENTS(g_aDivU); i++)
    387406    {
    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 uReminder = uDividend % uDivisor;
    392         if (   uQuotient != g_aDivU[i].uQuotient
    393             || uReminder != 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)
    394413            RTTestFailed(g_hTest, "i=%u %#018RX64 / %#018RX64 => q=%#018RX64 r=%#018RX64, expected q=%#018RX64 r=%#018RX64",
    395414                         i, g_aDivU[i].uDividend, g_aDivU[i].uDivisor,
    396                          uQuotient, uReminder, g_aDivU[i].uQuotient, g_aDivU[i].uReminder);
     415                         uQuotient, uRemainder, g_aDivU[i].uQuotient, g_aDivU[i].uRemainder);
    397416    }
    398417
     
    420439            RTTestFailed(g_hTest, "%#018RX64 %% %#018RX64 => %#018RX64, expected %#018RX64", uDividend.u, uDivisor.u, uResult, uExpected.u);
    421440    }
    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 uReminder = 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;
    428447        RTUINT64U uExpectedQ, uExpectedR;
    429448        RTUInt64DivRem(&uExpectedQ, &uExpectedR, &uDividend, &uDivisor);
    430         if (   uQuotient != uExpectedQ.u
    431             || uReminder != uExpectedR.u)
     449        if (   uQuotient  != uExpectedQ.u
     450            || uRemainder != uExpectedR.u)
    432451            RTTestFailed(g_hTest, "%#018RX64 / %#018RX64 => q=%#018RX64 r=%#018RX64, expected q=%#018RX64 r=%#018RX64",
    433                          uDividend.u, uDivisor.u, uQuotient, uReminder, uExpectedQ.u, uExpectedR.u);
     452                         uDividend.u, uDivisor.u, uQuotient, uRemainder, uExpectedQ.u, uExpectedR.u);
    434453    }
    435454}
     
    452471    { UINT64_C(0x0000000000000003), UINT64_C(0xfffffffffffffffe), /* => */ UINT64_C(0xffffffffffffffff), UINT64_C(0x0000000000000001) },
    453472    { 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) },
    454482};
    455483
     
    471499    {
    472500        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].uReminder)
     501        if ((uint64_t)iResult != g_aDivS[i].uRemainder)
    474502            RTTestFailed(g_hTest, "i=%u %#018RX64 %% %#018RX64 => %#018RX64, expected %#018RX64",
    475                          i, g_aDivS[i].uDividend, g_aDivS[i].uDivisor, iResult, g_aDivS[i].uReminder);
     503                         i, g_aDivS[i].uDividend, g_aDivS[i].uDivisor, iResult, g_aDivS[i].uRemainder);
    476504    }
    477505    for (size_t i = 0; i < RT_ELEMENTS(g_aDivS); i++)
    478506    {
    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 iReminder = iDividend % iDivisor;
    483         if (   (uint64_t)iQuotient != g_aDivS[i].uQuotient
    484             || (uint64_t)iReminder != 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)
    485513            RTTestFailed(g_hTest, "i=%u %#018RX64 / %#018RX64 => q=%#018RX64 r=%#018RX64, expected q=%#018RX64 r=%#018RX64",
    486514                         i, g_aDivS[i].uDividend, g_aDivS[i].uDivisor,
    487                          iQuotient, iReminder, g_aDivS[i].uQuotient, g_aDivS[i].uReminder);
     515                         iQuotient, iRemainder, g_aDivS[i].uQuotient, g_aDivS[i].uRemainder);
    488516    }
    489517
     
    523551    for (size_t i = 0; i < RANDOM_LOOPS; i++)
    524552    {
    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 iReminder = (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;
    529557        RTUINT64U uExpectedQ, uExpectedR;
    530558        RTUInt64DivRemSigned(&uExpectedQ, &uExpectedR, &uDividend, &uDivisor);
    531         if (   (uint64_t)iQuotient != uExpectedQ.u
    532             || (uint64_t)iReminder != uExpectedR.u)
     559        if (   (uint64_t)iQuotient  != uExpectedQ.u
     560            || (uint64_t)iRemainder != uExpectedR.u)
    533561            RTTestFailed(g_hTest, "%#018RX64 / %#018RX64 => q=%#018RX64 r=%#018RX64, expected q=%#018RX64 r=%#018RX64",
    534                          uDividend.u, uDivisor.u, iQuotient, iReminder, uExpectedQ.u, uExpectedR.u);
     562                         uDividend.u, uDivisor.u, iQuotient, iRemainder, uExpectedQ.u, uExpectedR.u);
    535563    }
    536564}
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette