VirtualBox

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


Ignore:
Timestamp:
Apr 4, 2024 8:54:42 AM (13 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162572
Message:

VMM/IEM: Rework the [v][u]comis[sd] instruction emulations to work by value instead by reference and drop the IEM_MC_FETCH_MEM_XMM_U32/IEM_MC_FETCH_XMM_U64 microcode statements, enables recompilation of those instructions, bugref:10614

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

Legend:

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

    r104129 r104150  
    74867486 * Compare SSE operations on single single-precision floating point values - outputting only EFLAGS.
    74877487 */
    7488 TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_EFL_R32_R32_T, SSE_COMPARE_EFL_R32_R32_TEST_T, PFNIEMAIMPLF2EFLMXCSR128);
     7488TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_EFL_R32_R32_T, SSE_COMPARE_EFL_R32_R32_TEST_T, PFNIEMAIMPLF2EFLMXCSRR32R32);
    74897489
    74907490static SSE_COMPARE_EFL_R32_R32_T g_aSseCompareEflR32R32[] =
     
    75187518    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareEflR32R32); iFn++)
    75197519    {
    7520         PFNIEMAIMPLF2EFLMXCSR128 const pfn = g_aSseCompareEflR32R32[iFn].pfnNative ? g_aSseCompareEflR32R32[iFn].pfnNative : g_aSseCompareEflR32R32[iFn].pfn;
     7520        PFNIEMAIMPLF2EFLMXCSRR32R32 const pfn = g_aSseCompareEflR32R32[iFn].pfnNative ? g_aSseCompareEflR32R32[iFn].pfnNative : g_aSseCompareEflR32R32[iFn].pfn;
    75217521
    75227522        IEMBINARYOUTPUT BinOut;
     
    75277527        {
    75287528            SSE_COMPARE_EFL_R32_R32_TEST_T TestData; RT_ZERO(TestData);
    7529             X86XMMREG ValIn1; RT_ZERO(ValIn1);
    7530             X86XMMREG ValIn2; RT_ZERO(ValIn2);
    75317529
    75327530            TestData.r32ValIn1 = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val1;
    75337531            TestData.r32ValIn2 = iTest < cTests ? RandR32Src(iTest) : s_aSpecials[iTest - cTests].Val2;
    7534 
    7535             ValIn1.ar32[0] = TestData.r32ValIn1;
    7536             ValIn2.ar32[0] = TestData.r32ValIn2;
    75377532
    75387533            if (   RTFLOAT32U_IS_NORMAL(&TestData.r32ValIn1)
     
    75587553                        uint32_t fMxcsrM  = fMxcsrIn;
    75597554                        uint32_t fEFlagsM = fEFlags;
    7560                         fMxcsrM = pfn(fMxcsrIn, &fEFlagsM, &ValIn1, &ValIn2);
     7555                        fMxcsrM = pfn(fMxcsrIn, &fEFlagsM, TestData.r32ValIn1, TestData.r32ValIn2);
    75617556                        TestData.fMxcsrIn   = fMxcsrIn;
    75627557                        TestData.fMxcsrOut  = fMxcsrM;
     
    75687563                        uint32_t fMxcsrU  = fMxcsrIn;
    75697564                        uint32_t fEFlagsU = fEFlags;
    7570                         fMxcsrU = pfn(fMxcsrIn, &fEFlagsU, &ValIn1, &ValIn2);
     7565                        fMxcsrU = pfn(fMxcsrIn, &fEFlagsU, TestData.r32ValIn1, TestData.r32ValIn2);
    75717566                        TestData.fMxcsrIn   = fMxcsrIn;
    75727567                        TestData.fMxcsrOut  = fMxcsrU;
     
    75817576                            uint32_t fMxcsr1  = fMxcsrIn;
    75827577                            uint32_t fEFlags1 = fEFlags;
    7583                             fMxcsr1 = pfn(fMxcsrIn, &fEFlags1, &ValIn1, &ValIn2);
     7578                            fMxcsr1 = pfn(fMxcsrIn, &fEFlags1, TestData.r32ValIn1, TestData.r32ValIn2);
    75847579                            TestData.fMxcsrIn   = fMxcsrIn;
    75857580                            TestData.fMxcsrOut  = fMxcsr1;
     
    75947589                                uint32_t fMxcsr2  = fMxcsrIn;
    75957590                                uint32_t fEFlags2 = fEFlags;
    7596                                 fMxcsr2 = pfn(fMxcsrIn, &fEFlags2, &ValIn1, &ValIn2);
     7591                                fMxcsr2 = pfn(fMxcsrIn, &fEFlags2, TestData.r32ValIn1, TestData.r32ValIn2);
    75977592                                TestData.fMxcsrIn   = fMxcsrIn;
    75987593                                TestData.fMxcsrOut  = fMxcsr2;
     
    76087603                                        uint32_t fMxcsr3  = fMxcsrIn;
    76097604                                        uint32_t fEFlags3 = fEFlags;
    7610                                         fMxcsr3 = pfn(fMxcsrIn, &fEFlags3, &ValIn1, &ValIn2);
     7605                                        fMxcsr3 = pfn(fMxcsrIn, &fEFlags3, TestData.r32ValIn1, TestData.r32ValIn2);
    76117606                                        TestData.fMxcsrIn   = fMxcsrIn;
    76127607                                        TestData.fMxcsrOut  = fMxcsr3;
     
    76347629        SSE_COMPARE_EFL_R32_R32_TEST_T const * const    paTests = g_aSseCompareEflR32R32[iFn].paTests;
    76357630        uint32_t const                                  cTests  = g_aSseCompareEflR32R32[iFn].cTests;
    7636         PFNIEMAIMPLF2EFLMXCSR128                        pfn     = g_aSseCompareEflR32R32[iFn].pfn;
     7631        PFNIEMAIMPLF2EFLMXCSRR32R32                     pfn     = g_aSseCompareEflR32R32[iFn].pfn;
    76377632        uint32_t const                                  cVars   = COUNT_VARIATIONS(g_aSseCompareEflR32R32[iFn]);
    76387633        if (!cTests) RTTestSkipped(g_hTest, "no tests");
     
    76417636            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    76427637            {
    7643                 X86XMMREG ValIn1; RT_ZERO(ValIn1);
    7644                 X86XMMREG ValIn2; RT_ZERO(ValIn2);
    7645 
    7646                 ValIn1.ar32[0] = paTests[iTest].r32ValIn1;
    7647                 ValIn2.ar32[0] = paTests[iTest].r32ValIn2;
    76487638                uint32_t fEFlags = paTests[iTest].fEflIn;
    7649                 uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &fEFlags, &ValIn1, &ValIn2);
     7639                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &fEFlags, paTests[iTest].r32ValIn1, paTests[iTest].r32ValIn2);
    76507640                if (   fMxcsr != paTests[iTest].fMxcsrOut
    76517641                    || fEFlags != paTests[iTest].fEflOut)
     
    76717661 * Compare SSE operations on single single-precision floating point values - outputting only EFLAGS.
    76727662 */
    7673 TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_EFL_R64_R64_T, SSE_COMPARE_EFL_R64_R64_TEST_T, PFNIEMAIMPLF2EFLMXCSR128);
     7663TYPEDEF_SUBTEST_TYPE(SSE_COMPARE_EFL_R64_R64_T, SSE_COMPARE_EFL_R64_R64_TEST_T, PFNIEMAIMPLF2EFLMXCSRR64R64);
    76747664
    76757665static SSE_COMPARE_EFL_R64_R64_T g_aSseCompareEflR64R64[] =
     
    77037693    for (size_t iFn = 0; iFn < RT_ELEMENTS(g_aSseCompareEflR64R64); iFn++)
    77047694    {
    7705         PFNIEMAIMPLF2EFLMXCSR128 const pfn = g_aSseCompareEflR64R64[iFn].pfnNative ? g_aSseCompareEflR64R64[iFn].pfnNative : g_aSseCompareEflR64R64[iFn].pfn;
     7695        PFNIEMAIMPLF2EFLMXCSRR64R64 const pfn = g_aSseCompareEflR64R64[iFn].pfnNative ? g_aSseCompareEflR64R64[iFn].pfnNative : g_aSseCompareEflR64R64[iFn].pfn;
    77067696
    77077697        IEMBINARYOUTPUT BinOut;
     
    77127702        {
    77137703            SSE_COMPARE_EFL_R64_R64_TEST_T TestData; RT_ZERO(TestData);
    7714             X86XMMREG ValIn1; RT_ZERO(ValIn1);
    7715             X86XMMREG ValIn2; RT_ZERO(ValIn2);
    77167704
    77177705            TestData.r64ValIn1 = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].Val1;
    77187706            TestData.r64ValIn2 = iTest < cTests ? RandR64Src(iTest) : s_aSpecials[iTest - cTests].Val2;
    7719 
    7720             ValIn1.ar64[0] = TestData.r64ValIn1;
    7721             ValIn2.ar64[0] = TestData.r64ValIn2;
    77227707
    77237708            if (   RTFLOAT64U_IS_NORMAL(&TestData.r64ValIn1)
     
    77437728                        uint32_t fMxcsrM  = fMxcsrIn;
    77447729                        uint32_t fEFlagsM = fEFlags;
    7745                         fMxcsrM = pfn(fMxcsrIn, &fEFlagsM, &ValIn1, &ValIn2);
     7730                        fMxcsrM = pfn(fMxcsrIn, &fEFlagsM, TestData.r64ValIn1, TestData.r64ValIn2);
    77467731                        TestData.fMxcsrIn   = fMxcsrIn;
    77477732                        TestData.fMxcsrOut  = fMxcsrM;
     
    77537738                        uint32_t fMxcsrU  = fMxcsrIn;
    77547739                        uint32_t fEFlagsU = fEFlags;
    7755                         fMxcsrU = pfn(fMxcsrIn, &fEFlagsU, &ValIn1, &ValIn2);
     7740                        fMxcsrU = pfn(fMxcsrIn, &fEFlagsU, TestData.r64ValIn1, TestData.r64ValIn2);
    77567741                        TestData.fMxcsrIn   = fMxcsrIn;
    77577742                        TestData.fMxcsrOut  = fMxcsrU;
     
    77667751                            uint32_t fMxcsr1  = fMxcsrIn;
    77677752                            uint32_t fEFlags1 = fEFlags;
    7768                             fMxcsr1 = pfn(fMxcsrIn, &fEFlags1, &ValIn1, &ValIn2);
     7753                            fMxcsr1 = pfn(fMxcsrIn, &fEFlags1, TestData.r64ValIn1, TestData.r64ValIn2);
    77697754                            TestData.fMxcsrIn   = fMxcsrIn;
    77707755                            TestData.fMxcsrOut  = fMxcsr1;
     
    77797764                                uint32_t fMxcsr2  = fMxcsrIn;
    77807765                                uint32_t fEFlags2 = fEFlags;
    7781                                 fMxcsr2 = pfn(fMxcsrIn, &fEFlags2, &ValIn1, &ValIn2);
     7766                                fMxcsr2 = pfn(fMxcsrIn, &fEFlags2, TestData.r64ValIn1, TestData.r64ValIn2);
    77827767                                TestData.fMxcsrIn   = fMxcsrIn;
    77837768                                TestData.fMxcsrOut  = fMxcsr2;
     
    77937778                                        uint32_t fMxcsr3  = fMxcsrIn;
    77947779                                        uint32_t fEFlags3 = fEFlags;
    7795                                         fMxcsr3 = pfn(fMxcsrIn, &fEFlags3, &ValIn1, &ValIn2);
     7780                                        fMxcsr3 = pfn(fMxcsrIn, &fEFlags3, TestData.r64ValIn1, TestData.r64ValIn2);
    77967781                                        TestData.fMxcsrIn   = fMxcsrIn;
    77977782                                        TestData.fMxcsrOut  = fMxcsr3;
     
    78197804        SSE_COMPARE_EFL_R64_R64_TEST_T const * const    paTests = g_aSseCompareEflR64R64[iFn].paTests;
    78207805        uint32_t const                                  cTests  = g_aSseCompareEflR64R64[iFn].cTests;
    7821         PFNIEMAIMPLF2EFLMXCSR128                        pfn     = g_aSseCompareEflR64R64[iFn].pfn;
     7806        PFNIEMAIMPLF2EFLMXCSRR64R64                     pfn     = g_aSseCompareEflR64R64[iFn].pfn;
    78227807        uint32_t const                                  cVars   = COUNT_VARIATIONS(g_aSseCompareEflR64R64[iFn]);
    78237808        if (!cTests) RTTestSkipped(g_hTest, "no tests");
     
    78267811            for (uint32_t iTest = 0; iTest < cTests; iTest++)
    78277812            {
    7828                 X86XMMREG ValIn1; RT_ZERO(ValIn1);
    7829                 X86XMMREG ValIn2; RT_ZERO(ValIn2);
    7830 
    7831                 ValIn1.ar64[0] = paTests[iTest].r64ValIn1;
    7832                 ValIn2.ar64[0] = paTests[iTest].r64ValIn2;
    78337813                uint32_t fEFlags = paTests[iTest].fEflIn;
    7834                 uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &fEFlags, &ValIn1, &ValIn2);
     7814                uint32_t fMxcsr = pfn(paTests[iTest].fMxcsrIn, &fEFlags, paTests[iTest].r64ValIn1, paTests[iTest].r64ValIn2);
    78357815                if (   fMxcsr != paTests[iTest].fMxcsrOut
    78367816                    || fEFlags != paTests[iTest].fEflOut)
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r104135 r104150  
    804804#define IEM_MC_FETCH_XREG_XMM(a_XmmValue, a_iXReg)          do { CHK_XREG_IDX(a_iXReg); CHK_VAR(a_XmmValue);  (a_XmmValue) = g_XmmZero; CHK_TYPE(X86XMMREG, a_XmmValue); (void)fSseRead;  (void)fMcBegin; } while (0)
    805805#define IEM_MC_FETCH_XREG_U64(a_u64Value, a_iXReg, a_iQWord)    do { CHK_XREG_IDX(a_iXReg); CHK_VAR(a_u64Value); (a_u64Value) = 0; CHK_TYPE(uint64_t, a_u64Value); (void)fSseRead; (void)fMcBegin; } while (0)
     806#define IEM_MC_FETCH_XREG_R64(a_r64Value, a_iXReg, a_iQWord)    do { CHK_XREG_IDX(a_iXReg); CHK_VAR(a_r64Value); (a_r64Value).u = 0; CHK_TYPE(RTFLOAT64U, a_r64Value); (void)fSseRead; (void)fMcBegin; } while (0)
    806807#define IEM_MC_FETCH_XREG_U32(a_u32Value, a_iXReg, a_iDWord)    do { CHK_XREG_IDX(a_iXReg); CHK_VAR(a_u32Value); (a_u32Value) = 0; CHK_TYPE(uint32_t, a_u32Value); (void)fSseRead; (void)fMcBegin; } while (0)
     808#define IEM_MC_FETCH_XREG_R32(a_r32Value, a_iXReg, a_iDWord)    do { CHK_XREG_IDX(a_iXReg); CHK_VAR(a_r32Value); (a_r32Value).u = 0; CHK_TYPE(RTFLOAT32U, a_r32Value); (void)fSseRead; (void)fMcBegin; } while (0)
    807809#define IEM_MC_FETCH_XREG_U16(a_u16Value, a_iXReg, a_iWord )    do { CHK_XREG_IDX(a_iXReg); CHK_VAR(a_u16Value); (a_u16Value) = 0; CHK_TYPE(uint16_t, a_u16Value); (void)fSseRead; (void)fMcBegin; } while (0)
    808810#define IEM_MC_FETCH_XREG_U8( a_u8Value,  a_iXReg, a_iByte)     do { CHK_XREG_IDX(a_iXReg); CHK_VAR(a_u8Value);  (a_u8Value)  = 0; CHK_TYPE(uint8_t,  a_u8Value);  (void)fSseRead; (void)fMcBegin; } while (0)
     
    909911#define IEM_MC_FETCH_MEM_XMM_NO_AC(a_XmmDst, a_iSeg, a_GCPtrMem)        do { CHK_SEG_IDX(a_iSeg); CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_VAR(a_XmmDst);  CHK_TYPE(X86XMMREG,  a_XmmDst);  (void)fMcBegin; } while (0)
    910912#define IEM_MC_FETCH_MEM_XMM_ALIGN_SSE(a_XmmDst, a_iSeg, a_GCPtrMem)    do { CHK_SEG_IDX(a_iSeg); CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_VAR(a_XmmDst);  CHK_TYPE(X86XMMREG,  a_XmmDst);  (void)fMcBegin; } while (0)
    911 #define IEM_MC_FETCH_MEM_XMM_U32(a_XmmDst, a_iDWord, a_iSeg, a_GCPtrMem) do{ CHK_SEG_IDX(a_iSeg); CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_VAR(a_XmmDst);  CHK_TYPE(X86XMMREG,  a_XmmDst);  AssertCompile((a_iDWord) < RT_ELEMENTS((a_XmmDst).au32)); (void)fMcBegin; } while (0)
    912 #define IEM_MC_FETCH_MEM_XMM_U64(a_XmmDst, a_iQWord, a_iSeg, a_GCPtrMem) do{ CHK_SEG_IDX(a_iSeg); CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_VAR(a_XmmDst);  CHK_TYPE(X86XMMREG,  a_XmmDst);  AssertCompile((a_iQWord) < RT_ELEMENTS((a_XmmDst).au64)); (void)fMcBegin; } while (0)
    913913#define IEM_MC_FETCH_MEM_U256(a_u256Dst, a_iSeg, a_GCPtrMem)            do { CHK_SEG_IDX(a_iSeg); CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_VAR(a_u256Dst); CHK_TYPE(RTUINT256U, a_u256Dst); (void)fMcBegin; } while (0)
    914914#define IEM_MC_FETCH_MEM_U256_NO_AC(a_u256Dst, a_iSeg, a_GCPtrMem)      do { CHK_SEG_IDX(a_iSeg); CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_VAR(a_u256Dst); CHK_TYPE(RTUINT256U, a_u256Dst); (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