VirtualBox

Changeset 106179 in vbox for trunk/src/VBox/VMM/testcase


Ignore:
Timestamp:
Sep 29, 2024 1:14:19 AM (4 months ago)
Author:
vboxsync
Message:

VMM/IEM: Reworked the div, idiv, mul and imul assembly workers and how we raise division error exceptions. The latter is to simplify eflags management. bugref:10720

Location:
trunk/src/VBox/VMM/testcase
Files:
2 edited

Legend:

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

    r105275 r106179  
    29912991            MULDIVU8_TEST_T Test;
    29922992            Test.fEflIn    = RandEFlags();
    2993             Test.fEflOut   = Test.fEflIn;
    29942993            Test.uDstIn    = RandU16Dst(iTest);
    29952994            Test.uDstOut   = Test.uDstIn;
    29962995            Test.uSrcIn    = RandU8Src(iTest);
    2997             Test.rc        = g_aMulDivU8[iFn].pfnNative(&Test.uDstOut, Test.uSrcIn, &Test.fEflOut);
     2996            uint32_t const fEflRet = g_aMulDivU8[iFn].pfnNative(&Test.uDstOut, Test.uSrcIn, Test.fEflIn);
     2997            Test.fEflOut   = fEflRet ? fEflRet : Test.fEflIn;
     2998            Test.rc        = fEflRet ? 0       : -1;
    29982999            GenerateBinaryWrite(&BinOut, &Test, sizeof(Test));
    29993000        }
     
    30033004            Test.fEflIn    = g_aMulDivU8[iFn].paFixedTests[iTest].fEflIn == UINT32_MAX ? RandEFlags()
    30043005                           : g_aMulDivU8[iFn].paFixedTests[iTest].fEflIn;
    3005             Test.fEflOut   = Test.fEflIn;
    30063006            Test.uDstIn    = g_aMulDivU8[iFn].paFixedTests[iTest].uDstIn;
    30073007            Test.uDstOut   = Test.uDstIn;
    30083008            Test.uSrcIn    = g_aMulDivU8[iFn].paFixedTests[iTest].uSrcIn;
    3009             Test.rc        = g_aMulDivU8[iFn].pfnNative(&Test.uDstOut, Test.uSrcIn, &Test.fEflOut);
     3009            uint32_t const fEflRet = g_aMulDivU8[iFn].pfnNative(&Test.uDstOut, Test.uSrcIn, Test.fEflIn);
     3010            Test.fEflOut   = fEflRet ? fEflRet : Test.fEflIn;
     3011            Test.rc        = fEflRet ? 0       : -1;
    30103012            if (g_aMulDivU8[iFn].paFixedTests[iTest].rc == 0 || g_aMulDivU8[iFn].paFixedTests[iTest].rc == -1)
    30113013                Test.rc = g_aMulDivU8[iFn].paFixedTests[iTest].rc;
     
    30223024    uint32_t const fEflIn = pEntry->fEflIn;
    30233025    uint16_t const uDstIn = pEntry->uDstIn;
    3024     uint8_t  const uSrcIn  = pEntry->uSrcIn;
     3026    uint8_t  const uSrcIn = pEntry->uSrcIn;
    30253027    cIterations /= 4;
    30263028    RTThreadYield();
    3027     uint64_t const nsStart     = RTTimeNanoTS();
     3029    uint64_t const nsStart = RTTimeNanoTS();
    30283030    for (uint32_t i = 0; i < cIterations; i++)
    30293031    {
    3030         uint32_t fBenchEfl  = fEflIn;
    30313032        uint16_t uBenchDst = uDstIn;
    3032         pfn(&uBenchDst, uSrcIn, &fBenchEfl);
    3033 
    3034         fBenchEfl = fEflIn;
     3033        pfn(&uBenchDst, uSrcIn, fEflIn);
     3034
    30353035        uBenchDst = uDstIn;
    3036         pfn(&uBenchDst, uSrcIn, &fBenchEfl);
    3037 
    3038         fBenchEfl = fEflIn;
     3036        pfn(&uBenchDst, uSrcIn, fEflIn);
     3037
    30393038        uBenchDst = uDstIn;
    3040         pfn(&uBenchDst, uSrcIn, &fBenchEfl);
    3041 
    3042         fBenchEfl = fEflIn;
     3039        pfn(&uBenchDst, uSrcIn, fEflIn);
     3040
    30433041        uBenchDst = uDstIn;
    3044         pfn(&uBenchDst, uSrcIn, &fBenchEfl);
     3042        pfn(&uBenchDst, uSrcIn, fEflIn);
    30453043    }
    30463044    return RTTimeNanoTS() - nsStart;
     
    30633061            for (uint32_t iTest = 0; iTest < cTests; iTest++ )
    30643062            {
    3065                 uint32_t fEfl  = paTests[iTest].fEflIn;
    3066                 uint16_t uDst  = paTests[iTest].uDstIn;
    3067                 int      rc    = g_aMulDivU8[iFn].pfn(&uDst, paTests[iTest].uSrcIn, &fEfl);
     3063                uint16_t uDst = paTests[iTest].uDstIn;
     3064                uint32_t fEfl = pfn(&uDst, paTests[iTest].uSrcIn, paTests[iTest].fEflIn);
     3065                int      rc   = fEfl ? 0    : -1;
     3066                fEfl          = fEfl ? fEfl : paTests[iTest].fEflIn;
    30683067                if (   uDst != paTests[iTest].uDstOut
    30693068                    || (fEfl | fEflIgn) != (paTests[iTest].fEflOut | fEflIgn)
     
    30783077                else
    30793078                {
    3080                      *g_pu16  = paTests[iTest].uDstIn;
    3081                      *g_pfEfl = paTests[iTest].fEflIn;
    3082                      rc = g_aMulDivU8[iFn].pfn(g_pu16, paTests[iTest].uSrcIn, g_pfEfl);
    3083                      RTTEST_CHECK(g_hTest, *g_pu16  == paTests[iTest].uDstOut);
    3084                      RTTEST_CHECK(g_hTest, (*g_pfEfl | fEflIgn) == (paTests[iTest].fEflOut | fEflIgn));
    3085                      RTTEST_CHECK(g_hTest, rc  == paTests[iTest].rc);
     3079                     *g_pu16 = paTests[iTest].uDstIn;
     3080                     fEfl = pfn(g_pu16, paTests[iTest].uSrcIn, paTests[iTest].fEflIn);
     3081                     rc   = fEfl ? 0    : -1;
     3082                     fEfl = fEfl ? fEfl : paTests[iTest].fEflIn;
     3083                     RTTEST_CHECK(g_hTest, *g_pu16 == paTests[iTest].uDstOut);
     3084                     RTTEST_CHECK(g_hTest, (fEfl | fEflIgn) == (paTests[iTest].fEflOut | fEflIgn));
     3085                     RTTEST_CHECK(g_hTest, rc == paTests[iTest].rc);
    30863086                }
    30873087            }
     
    31603160        { \
    31613161            Test.fEflIn    = RandEFlags(); \
    3162             Test.fEflOut   = Test.fEflIn; \
    31633162            Test.uDst1In   = RandU ## a_cBits ## Dst(iTest); \
    31643163            Test.uDst1Out  = Test.uDst1In; \
     
    31663165            Test.uDst2Out  = Test.uDst2In; \
    31673166            Test.uSrcIn    = RandU ## a_cBits ## Src(iTest); \
    3168             Test.rc        = a_aSubTests[iFn].pfnNative(&Test.uDst1Out, &Test.uDst2Out, Test.uSrcIn, &Test.fEflOut); \
     3167            uint32_t const fEflRet = a_aSubTests[iFn].pfnNative(&Test.uDst1Out, &Test.uDst2Out, Test.uSrcIn, Test.fEflIn); \
     3168            Test.fEflOut   = fEflRet ? fEflRet : Test.fEflIn; \
     3169            Test.rc        = fEflRet ? 0       : -1; \
    31693170            GenerateBinaryWrite(&BinOut, &Test, sizeof(Test)); \
    31703171        } \
     
    31733174            Test.fEflIn    = a_aSubTests[iFn].paFixedTests[iTest].fEflIn == UINT32_MAX ? RandEFlags() \
    31743175                           : a_aSubTests[iFn].paFixedTests[iTest].fEflIn; \
    3175             Test.fEflOut   = Test.fEflIn; \
    31763176            Test.uDst1In   = a_aSubTests[iFn].paFixedTests[iTest].uDst1In; \
    31773177            Test.uDst1Out  = Test.uDst1In; \
     
    31793179            Test.uDst2Out  = Test.uDst2In; \
    31803180            Test.uSrcIn    = a_aSubTests[iFn].paFixedTests[iTest].uSrcIn; \
    3181             Test.rc        = a_aSubTests[iFn].pfnNative(&Test.uDst1Out, &Test.uDst2Out, Test.uSrcIn, &Test.fEflOut); \
     3181            uint32_t const fEflRet = a_aSubTests[iFn].pfnNative(&Test.uDst1Out, &Test.uDst2Out, Test.uSrcIn, Test.fEflIn); \
     3182            Test.fEflOut   = fEflRet ? fEflRet : Test.fEflIn; \
     3183            Test.rc        = fEflRet ? 0       : -1; \
    31823184            if (a_aSubTests[iFn].paFixedTests[iTest].rc == 0 || a_aSubTests[iFn].paFixedTests[iTest].rc == -1) \
    31833185                Test.rc = a_aSubTests[iFn].paFixedTests[iTest].rc; \
     
    32163218    cIterations /= 4; \
    32173219    RTThreadYield(); \
    3218     uint64_t const nsStart     = RTTimeNanoTS(); \
     3220    uint64_t const nsStart = RTTimeNanoTS(); \
    32193221    for (uint32_t i = 0; i < cIterations; i++) \
    32203222    { \
    3221         uint32_t fBenchEfl  = fEflIn; \
    32223223        a_uType  uBenchDst1 = uDst1In;  \
    32233224        a_uType  uBenchDst2 = uDst2In;  \
    3224         pfn(&uBenchDst1, &uBenchDst2, uSrcIn, &fBenchEfl); \
     3225        pfn(&uBenchDst1, &uBenchDst2, uSrcIn, fEflIn); \
    32253226        \
    3226         fBenchEfl  = fEflIn; \
    32273227        uBenchDst1 = uDst1In; \
    32283228        uBenchDst2 = uDst2In; \
    3229         pfn(&uBenchDst1, &uBenchDst2, uSrcIn, &fBenchEfl); \
     3229        pfn(&uBenchDst1, &uBenchDst2, uSrcIn, fEflIn); \
    32303230        \
    3231         fBenchEfl  = fEflIn; \
    32323231        uBenchDst1 = uDst1In; \
    32333232        uBenchDst2 = uDst2In; \
    3234         pfn(&uBenchDst1, &uBenchDst2, uSrcIn, &fBenchEfl); \
     3233        pfn(&uBenchDst1, &uBenchDst2, uSrcIn, fEflIn); \
    32353234        \
    3236         fBenchEfl  = fEflIn; \
    32373235        uBenchDst1 = uDst1In; \
    32383236        uBenchDst2 = uDst2In; \
    3239         pfn(&uBenchDst1, &uBenchDst2, uSrcIn, &fBenchEfl); \
     3237        pfn(&uBenchDst1, &uBenchDst2, uSrcIn, fEflIn); \
    32403238    } \
    32413239    return RTTimeNanoTS() - nsStart; \
     
    32583256            for (uint32_t iTest = 0; iTest < cTests; iTest++ ) \
    32593257            { \
    3260                 uint32_t fEfl  = paTests[iTest].fEflIn; \
    32613258                a_uType  uDst1 = paTests[iTest].uDst1In; \
    32623259                a_uType  uDst2 = paTests[iTest].uDst2In; \
    3263                 int rc = pfn(&uDst1, &uDst2, paTests[iTest].uSrcIn, &fEfl); \
     3260                uint32_t fEfl = pfn(&uDst1, &uDst2, paTests[iTest].uSrcIn, paTests[iTest].fEflIn); \
     3261                int      rc   = fEfl ? 0    : -1; \
     3262                fEfl          = fEfl ? fEfl : paTests[iTest].fEflIn; \
    32643263                if (   uDst1 != paTests[iTest].uDst1Out \
    32653264                    || uDst2 != paTests[iTest].uDst2Out \
     
    32803279                     *g_pu ## a_cBits        = paTests[iTest].uDst1In; \
    32813280                     *g_pu ## a_cBits ## Two = paTests[iTest].uDst2In; \
    3282                      *g_pfEfl                = paTests[iTest].fEflIn; \
    3283                      rc  = pfn(g_pu ## a_cBits, g_pu ## a_cBits ## Two, paTests[iTest].uSrcIn, g_pfEfl); \
     3281                     fEfl = pfn(g_pu ## a_cBits, g_pu ## a_cBits ## Two, paTests[iTest].uSrcIn, paTests[iTest].fEflIn); \
     3282                     rc   = fEfl ? 0    : -1; \
     3283                     fEfl = fEfl ? fEfl : paTests[iTest].fEflIn; \
    32843284                     RTTEST_CHECK(g_hTest, *g_pu ## a_cBits        == paTests[iTest].uDst1Out); \
    32853285                     RTTEST_CHECK(g_hTest, *g_pu ## a_cBits ## Two == paTests[iTest].uDst2Out); \
    3286                      RTTEST_CHECK(g_hTest, (*g_pfEfl | fEflIgn)    == (paTests[iTest].fEflOut | fEflIgn)); \
     3286                     RTTEST_CHECK(g_hTest, (fEfl | fEflIgn)        == (paTests[iTest].fEflOut | fEflIgn)); \
    32873287                     RTTEST_CHECK(g_hTest, rc                      == paTests[iTest].rc); \
    32883288                } \
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r106097 r106179  
    618618#define IEM_MC_IND_CALL_U64_AND_FINISH(a_u64NewIP)      do { (void)fMcBegin; CHK_TYPE(uint64_t, a_u64NewIP); return VINF_SUCCESS; } while (0)
    619619#define IEM_MC_RETN_AND_FINISH(a_u16Pop)                do { (void)fMcBegin; return VINF_SUCCESS; } while (0)
    620 #define IEM_MC_RAISE_DIVIDE_ERROR()                     do { (void)fMcBegin; return VERR_TRPM_ACTIVE_TRAP; } while (0)
     620#define IEM_MC_RAISE_DIVIDE_ERROR_IF_LOCAL_IS_ZERO(a_uVar) do { (void)fMcBegin; CHK_VAR(a_uVar); if (a_uVar == 0) return VERR_TRPM_ACTIVE_TRAP; } while (0)
    621621#define IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE()       do { (void)fMcBegin; } while (0)
    622622#define IEM_MC_MAYBE_RAISE_WAIT_DEVICE_NOT_AVAILABLE()  do { (void)fMcBegin; } while (0)
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