VirtualBox

Ignore:
Timestamp:
Jan 23, 2024 4:19:17 PM (12 months ago)
Author:
vboxsync
Message:

VMM/IEM: Assembly version of iemAImpl_sub_*. bugref:10376

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/testcase/tstIEMAImpl.cpp

    r102896 r103003  
    4444#include <iprt/string.h>
    4545#include <iprt/test.h>
     46#include <iprt/time.h>
     47#include <iprt/thread.h>
    4648#include <VBox/version.h>
    4749
     
    160162static const char  *g_apszIncludeTestPatterns[64];
    161163static const char  *g_apszExcludeTestPatterns[64];
     164
     165/** Higher value, means longer benchmarking. */
     166static uint64_t     g_cPicoSecBenchmark = 0;
    162167
    163168static unsigned     g_cVerbosity = 0;
     
    13811386#endif
    13821387
     1388
     1389/** Based on a quick probe run, guess how long to run the benchmark. */
     1390static uint32_t EstimateIterations(uint32_t cProbeIterations, uint64_t cNsProbe)
     1391{
     1392    uint64_t cPicoSecPerIteration = cNsProbe * 1000 / cProbeIterations;
     1393    uint64_t cIterations = g_cPicoSecBenchmark / cPicoSecPerIteration;
     1394    if (cIterations > _2G)
     1395        return _2G;
     1396    if (cIterations < _4K)
     1397        return _4K;
     1398    return RT_ALIGN_32((uint32_t)cIterations, _4K);
     1399}
     1400
     1401
    13831402#define TEST_BINARY_OPS(a_cBits, a_uType, a_Fmt, a_TestType, a_aSubTests) \
    13841403GEN_BINARY_TESTS(a_cBits, a_Fmt, a_TestType) \
     1404\
     1405static uint64_t BinU ## a_cBits ## Bench(uint32_t cIterations, PFNIEMAIMPLBINU ## a_cBits pfn, a_TestType const *pEntry) \
     1406{ \
     1407    uint32_t const fEflIn = pEntry->fEflIn; \
     1408    a_uType  const uDstIn = pEntry->uDstIn; \
     1409    a_uType  const uSrcIn = pEntry->uSrcIn; \
     1410    cIterations /= 4; \
     1411    RTThreadYield(); \
     1412    uint64_t const nsStart     = RTTimeNanoTS(); \
     1413    for (uint32_t i = 0; i < cIterations; i++) \
     1414    { \
     1415        uint32_t fBenchEfl = fEflIn; \
     1416        a_uType  uBenchDst = uDstIn;  \
     1417        pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1418        \
     1419        fBenchEfl = fEflIn; \
     1420        uBenchDst = uDstIn;  \
     1421        pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1422        \
     1423        fBenchEfl = fEflIn; \
     1424        uBenchDst = uDstIn;  \
     1425        pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1426        \
     1427        fBenchEfl = fEflIn; \
     1428        uBenchDst = uDstIn;  \
     1429        pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1430    } \
     1431    return RTTimeNanoTS() - nsStart; \
     1432} \
    13851433\
    13861434static void BinU ## a_cBits ## Test(void) \
     
    13931441        PFNIEMAIMPLBINU ## a_cBits pfn     = a_aSubTests[iFn].pfn; \
    13941442        uint32_t const             cVars   = COUNT_VARIATIONS(a_aSubTests[iFn]); \
    1395         if (!cTests) RTTestSkipped(g_hTest, "no tests"); \
     1443        if (!cTests) { RTTestSkipped(g_hTest, "no tests"); continue; } \
    13961444        for (uint32_t iVar = 0; iVar < cVars; iVar++) \
    13971445        { \
     
    14021450                pfn(&uDst, paTests[iTest].uSrcIn, &fEfl); \
    14031451                if (   uDst != paTests[iTest].uDstOut \
    1404                     || fEfl != paTests[iTest].fEflOut) \
     1452                    || fEfl != paTests[iTest].fEflOut ) \
    14051453                    RTTestFailed(g_hTest, "#%u%s: efl=%#08x dst=" a_Fmt " src=" a_Fmt " -> efl=%#08x dst=" a_Fmt ", expected %#08x & " a_Fmt "%s - %s\n", \
    14061454                                 iTest, !iVar ? "" : "/n", paTests[iTest].fEflIn, paTests[iTest].uDstIn, paTests[iTest].uSrcIn, \
     
    14131461                     *g_pfEfl = paTests[iTest].fEflIn; \
    14141462                     pfn(g_pu ## a_cBits, paTests[iTest].uSrcIn, g_pfEfl); \
    1415                      RTTEST_CHECK(g_hTest, *g_pu ## a_cBits == paTests[iTest].uDstOut); \
    1416                      RTTEST_CHECK(g_hTest, *g_pfEfl         == paTests[iTest].fEflOut); \
     1463                     RTTEST_CHECK(g_hTest, *g_pu ## a_cBits  == paTests[iTest].uDstOut); \
     1464                     RTTEST_CHECK(g_hTest, *g_pfEfl == paTests[iTest].fEflOut); \
    14171465                } \
    14181466            } \
     1467            \
     1468            /* Benchmark if all succeeded. */ \
     1469            if (g_cPicoSecBenchmark && RTTestSubErrorCount(g_hTest) == 0) \
     1470            { \
     1471                uint32_t const iTest       = cTests / 2; \
     1472                uint32_t const cIterations = EstimateIterations(_64K, BinU ## a_cBits ## Bench(_64K, pfn, &paTests[iTest])); \
     1473                uint64_t const cNsRealRun  = BinU ## a_cBits ## Bench(cIterations, pfn, &paTests[iTest]); \
     1474                RTTestValueF(g_hTest, cNsRealRun * 1000 / cIterations, RTTESTUNIT_PS_PER_CALL, \
     1475                             "%s%s", a_aSubTests[iFn].pszName, iVar ? "-native" : ""); \
     1476            } \
     1477            \
     1478            /* Next variation is native. */ \
    14191479            pfn = a_aSubTests[iFn].pfnNative; \
    14201480        } \
     
    93909450        { "--generate",             'g', RTGETOPT_REQ_NOTHING },
    93919451        { "--test",                 't', RTGETOPT_REQ_NOTHING },
     9452        { "--benchmark",            'b', RTGETOPT_REQ_NOTHING },
    93929453        // test selection (both)
    93939454        { "--all",                  'a', RTGETOPT_REQ_NOTHING },
     
    94239484        {
    94249485            case 'g':
    9425                 enmMode     = kModeGenerate;
     9486                enmMode                 = kModeGenerate;
     9487                g_cPicoSecBenchmark     = 0;
    94269488                break;
    94279489            case 't':
    9428                 enmMode     = kModeTest;
     9490                enmMode                 = kModeTest;
     9491                g_cPicoSecBenchmark     = 0;
     9492                break;
     9493            case 'b':
     9494                enmMode                 = kModeTest;
     9495                g_cPicoSecBenchmark    += RT_NS_1SEC / 2 * UINT64_C(1000); /* half a second in pico seconds */
    94299496                break;
    94309497
     
    95179584                         "  -t, --test\n"
    95189585                         "    Execute tests.\n"
     9586                         "  -b, --benchmark\n"
     9587                         "    Execute tests and do 1/2 seconds of benchmarking.\n"
     9588                         "    Repeating the option increases the benchmark duration by 0.5 seconds.\n"
    95199589                         "\n"
    95209590                         "Test selection (both modes):\n"
Note: See TracChangeset for help on using the changeset viewer.

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