VirtualBox

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


Ignore:
Timestamp:
Apr 5, 2024 2:45:23 PM (13 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162624
Message:

VMM/IEM: Refactoring assembly helpers to not pass eflags by reference but instead by value and return the updated value (via eax/w0) - first chunk: ADD,ADC,SUB,SBB,CMP,TEST,AND,OR,XOR. bugref:10376

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

Legend:

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

    r104174 r104195  
    17611761            a_TestType Test; \
    17621762            Test.fEflIn    = RandEFlags(); \
    1763             Test.fEflOut   = Test.fEflIn; \
    17641763            Test.uDstIn    = RandU ## a_cBits ## Dst(iTest); \
    17651764            Test.uDstOut   = Test.uDstIn; \
     
    17681767                Test.uSrcIn &= a_cBits - 1; /* Restrict bit index according to operand width */ \
    17691768            Test.uMisc     = 0; \
    1770             pfn(&Test.uDstOut, Test.uSrcIn, &Test.fEflOut); \
     1769            Test.fEflOut   = pfn(Test.fEflIn, &Test.uDstOut, Test.uSrcIn); \
    17711770            GenerateBinaryWrite(&BinOut, &Test, sizeof(Test)); \
    17721771        } \
     
    17761775            Test.fEflIn    = g_aBinU ## a_cBits[iFn].paFixedTests[iTest].fEflIn == UINT32_MAX ? RandEFlags() \
    17771776                           : g_aBinU ## a_cBits[iFn].paFixedTests[iTest].fEflIn; \
    1778             Test.fEflOut   = Test.fEflIn; \
    17791777            Test.uDstIn    = g_aBinU ## a_cBits[iFn].paFixedTests[iTest].uDstIn; \
    17801778            Test.uDstOut   = Test.uDstIn; \
    17811779            Test.uSrcIn    = g_aBinU ## a_cBits[iFn].paFixedTests[iTest].uSrcIn; \
    17821780            Test.uMisc     = g_aBinU ## a_cBits[iFn].paFixedTests[iTest].uMisc; \
    1783             pfn(&Test.uDstOut, Test.uSrcIn, &Test.fEflOut); \
     1781            Test.fEflOut   = pfn(Test.fEflIn, &Test.uDstOut, Test.uSrcIn); \
    17841782            GenerateBinaryWrite(&BinOut, &Test, sizeof(Test)); \
    17851783        } \
     
    18181816    cIterations /= 4; \
    18191817    RTThreadYield(); \
    1820     uint64_t const nsStart     = RTTimeNanoTS(); \
     1818    uint64_t const nsStart = RTTimeNanoTS(); \
    18211819    for (uint32_t i = 0; i < cIterations; i++) \
    18221820    { \
    1823         uint32_t fBenchEfl = fEflIn; \
    1824         a_uType  uBenchDst = uDstIn;  \
    1825         pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1821        a_uType uBenchDst = uDstIn;  \
     1822        pfn(fEflIn, &uBenchDst, uSrcIn); \
    18261823        \
    1827         fBenchEfl = fEflIn; \
    18281824        uBenchDst = uDstIn;  \
    1829         pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1825        pfn(fEflIn, &uBenchDst, uSrcIn); \
    18301826        \
    1831         fBenchEfl = fEflIn; \
    18321827        uBenchDst = uDstIn;  \
    1833         pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1828        pfn(fEflIn, &uBenchDst, uSrcIn); \
    18341829        \
    1835         fBenchEfl = fEflIn; \
    18361830        uBenchDst = uDstIn;  \
    1837         pfn(&uBenchDst, uSrcIn, &fBenchEfl); \
     1831        pfn(fEflIn, &uBenchDst, uSrcIn); \
    18381832    } \
    18391833    return RTTimeNanoTS() - nsStart; \
     
    18551849            for (uint32_t iTest = 0; iTest < cTests; iTest++ ) \
    18561850            { \
    1857                 uint32_t fEfl = paTests[iTest].fEflIn; \
    18581851                a_uType  uDst = paTests[iTest].uDstIn; \
    1859                 pfn(&uDst, paTests[iTest].uSrcIn, &fEfl); \
     1852                uint32_t fEfl = pfn(paTests[iTest].fEflIn, &uDst, paTests[iTest].uSrcIn); \
    18601853                if (   uDst != paTests[iTest].uDstOut \
    1861                     || fEfl != paTests[iTest].fEflOut ) \
     1854                    || fEfl != paTests[iTest].fEflOut) \
    18621855                    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", \
    18631856                                 iTest, !iVar ? "" : "/n", paTests[iTest].fEflIn, paTests[iTest].uDstIn, paTests[iTest].uSrcIn, \
     
    18681861                { \
    18691862                     *g_pu ## a_cBits  = paTests[iTest].uDstIn; \
    1870                      *g_pfEfl = paTests[iTest].fEflIn; \
    1871                      pfn(g_pu ## a_cBits, paTests[iTest].uSrcIn, g_pfEfl); \
     1863                     fEfl = pfn(paTests[iTest].fEflIn, g_pu ## a_cBits, paTests[iTest].uSrcIn); \
    18721864                     RTTEST_CHECK(g_hTest, *g_pu ## a_cBits  == paTests[iTest].uDstOut); \
    1873                      RTTEST_CHECK(g_hTest, *g_pfEfl == paTests[iTest].fEflOut); \
     1865                     RTTEST_CHECK(g_hTest, fEfl == paTests[iTest].fEflOut); \
    18741866                } \
    18751867            } \
     
    19461938    ENTRY_BIN_PFN_CAST(cmp_u16,   PFNIEMAIMPLBINU16),
    19471939    ENTRY_BIN_PFN_CAST(test_u16,  PFNIEMAIMPLBINU16),
     1940#if 0 /** @todo convert to new eflags format  */
    19481941    ENTRY_BIN_PFN_CAST_EX(bt_u16, PFNIEMAIMPLBINU16, 1),
    19491942    ENTRY_BIN_EX(btc_u16, 1),
     
    19601953    ENTRY_BIN_INTEL(imul_two_u16, X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF),
    19611954    ENTRY_BIN(arpl),
     1955#endif
    19621956};
    19631957TEST_BINARY_OPS(16, uint16_t, "%#06x", BINU16_TEST_T, g_aBinU16)
     
    19921986    ENTRY_BIN_PFN_CAST(cmp_u32,   PFNIEMAIMPLBINU32),
    19931987    ENTRY_BIN_PFN_CAST(test_u32,  PFNIEMAIMPLBINU32),
     1988#if 0 /** @todo convert to new eflags format  */
    19941989    ENTRY_BIN_PFN_CAST_EX(bt_u32, PFNIEMAIMPLBINU32, 1),
    19951990    ENTRY_BIN_EX(btc_u32, 1),
     
    20072002    ENTRY_BIN(adcx_u32),
    20082003    ENTRY_BIN(adox_u32),
     2004#endif
    20092005};
    20102006TEST_BINARY_OPS(32, uint32_t, "%#010RX32", BINU32_TEST_T, g_aBinU32)
     
    20392035    ENTRY_BIN_PFN_CAST(cmp_u64,   PFNIEMAIMPLBINU64),
    20402036    ENTRY_BIN_PFN_CAST(test_u64,  PFNIEMAIMPLBINU64),
     2037#if 0 /** @todo convert to new eflags format  */
    20412038    ENTRY_BIN_PFN_CAST_EX(bt_u64, PFNIEMAIMPLBINU64, 1),
    20422039    ENTRY_BIN_EX(btc_u64, 1),
     
    20542051    ENTRY_BIN(adcx_u64),
    20552052    ENTRY_BIN(adox_u64),
     2053#endif
    20562054};
    20572055TEST_BINARY_OPS(64, uint64_t, "%#018RX64", BINU64_TEST_T, g_aBinU64)
     
    22292227                                 EFlagsDiff(fEfl, paTests[iTest].fEflOut)); \
    22302228                /* positive */ \
    2231                 uint32_t fEflExpect = paTests[iTest].fEflIn; \
    22322229                uA                  = paTests[iTest].uDstIn; \
    2233                 s_aFuncs[iFn].pfnSub(&uA, uA, &fEflExpect); \
     2230                uint32_t fEflExpect = s_aFuncs[iFn].pfnSub(paTests[iTest].fEflIn, &uA, uA); \
    22342231                fEfl                = paTests[iTest].fEflIn; \
    22352232                uA                  = paTests[iTest].uDstIn; \
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r104183 r104195  
    662662    uint32_t *a_pName = &a_Name; \
    663663    NOREF(a_pName)
     664#define IEM_MC_ARG_EFLAGS(a_Name, a_iArg) IEM_MC_ARG(uint32_t, a_Name, a_iArg); IEM_MC_FETCH_EFLAGS(a_Name)
    664665
    665666#define IEM_MC_COMMIT_EFLAGS(a_EFlags)                  do { CHK_TYPE(uint32_t, a_EFlags); (void)fMcBegin; } while (0)
     
    10021003#define IEM_MC_CALL_VOID_AIMPL_4(a_pfn, a0, a1, a2, a3) \
    10031004    do { CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); CHK_CALL_ARG(a3, 3); (void)fMcBegin; } while (0)
    1004 #define IEM_MC_CALL_AIMPL_3(a_rc, a_pfn, a0, a1, a2) \
     1005#define IEM_MC_CALL_AIMPL_3(a_rcType, a_rc, a_pfn, a0, a1, a2) \
     1006    IEM_MC_LOCAL(a_rcType, a_rc); \
    10051007    do { CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2);  (a_rc) = VINF_SUCCESS; (void)fMcBegin; } while (0)
    1006 #define IEM_MC_CALL_AIMPL_4(a_rc, a_pfn, a0, a1, a2, a3) \
     1008#define IEM_MC_CALL_AIMPL_4(a_rcType, a_rc, a_pfn, a0, a1, a2, a3) \
     1009    IEM_MC_LOCAL(a_rcType, a_rc); \
    10071010    do { CHK_CALL_ARG(a0, 0); CHK_CALL_ARG(a1, 1); CHK_CALL_ARG(a2, 2); CHK_CALL_ARG(a3, 3);  (a_rc) = VINF_SUCCESS; (void)fMcBegin; } while (0)
    10081011#define IEM_MC_CALL_CIMPL_0(a_fFlags, a_fGstShwFlush, a_pfnCImpl)                       do { (void)fMcBegin; } while (0)
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