VirtualBox

Changeset 103964 in vbox


Ignore:
Timestamp:
Mar 20, 2024 3:01:46 PM (11 months ago)
Author:
vboxsync
Message:

VMM/IEM: Some statistics on the SIMD register allocator and some fixes, bugref:10614

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp

    r103953 r103964  
    41214121            uint32_t const idxVar = ASMBitFirstSetU32(fVars) - 1;
    41224122            uint8_t const  idxReg = pReNative->Core.aVars[idxVar].idxReg;
     4123#ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR
     4124            if (pReNative->Core.aVars[idxVar].fSimdReg) /* Need to ignore SIMD variables here or we end up freeing random registers. */
     4125                continue;
     4126#endif
     4127
    41234128            if (   idxReg < RT_ELEMENTS(pReNative->Core.aHstRegs)
    41244129                && (RT_BIT_32(idxReg) & fRegMask)
     
    53345339                                             uint32_t fRegMask = IEMNATIVE_HST_SIMD_REG_MASK & ~IEMNATIVE_SIMD_REG_FIXED_MASK)
    53355340{
    5336     //STAM_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeRegFindFree);
     5341    STAM_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeSimdRegFindFree);
    53375342    Assert(!(fRegMask & ~IEMNATIVE_HST_SIMD_REG_MASK));
    53385343    Assert(!(fRegMask & IEMNATIVE_SIMD_REG_FIXED_MASK));
     
    53445349    if (fRegs)
    53455350    {
    5346         //STAM_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeRegFindFreeNoVar);
     5351        STAM_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeSimdRegFindFreeNoVar);
    53475352
    53485353#if 0 /** @todo def IEMNATIVE_WITH_LIVENESS_ANALYSIS */
     
    53775382            if (pReNative->Core.bmGstRegShadows & fToFreeMask)
    53785383            {
    5379                 STAM_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeRegFindFreeLivenessUnshadowed);
     5384                STAM_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeSimdRegFindFreeLivenessUnshadowed);
    53805385                iemNativeRegFlushGuestShadows(pReNative, fToFreeMask);
    53815386                Assert(fRegs == (~pReNative->Core.bmHstRegs & fRegMask)); /* this shall not change. */
     
    53855390                if (fUnshadowedRegs)
    53865391                {
    5387                     STAM_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeRegFindFreeLivenessHelped);
     5392                    STAM_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeSimdRegFindFreeLivenessHelped);
    53885393                    return (fPreferVolatile
    53895394                            ? ASMBitFirstSetU32(fUnshadowedRegs)
     
    54285433    }
    54295434
     5435    AssertFailed(); /** @todo The following needs testing when it actually gets hit. */
     5436
    54305437    /*
    54315438     * Try free up a variable that's in a register.
     
    54345441     * saved on the stack, then in the second round move things to the stack.
    54355442     */
    5436     //STAM_REL_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeRegFindFreeVar);
    5437     AssertReleaseFailed(); /** @todo No variable support right now. */
    5438 #if 0
     5443    STAM_REL_COUNTER_INC(&pReNative->pVCpu->iem.s.StatNativeSimdRegFindFreeVar);
    54395444    for (uint32_t iLoop = 0; iLoop < 2; iLoop++)
    54405445    {
    5441         uint32_t fVars = pReNative->Core.bmSimdVars;
     5446        uint32_t fVars = pReNative->Core.bmVars;
    54425447        while (fVars)
    54435448        {
    54445449            uint32_t const idxVar = ASMBitFirstSetU32(fVars) - 1;
    5445             uint8_t const  idxReg = pReNative->Core.aSimdVars[idxVar].idxReg;
     5450            uint8_t const  idxReg = pReNative->Core.aVars[idxVar].idxReg;
     5451            if (!pReNative->Core.aVars[idxVar].fSimdReg) /* Ignore non SIMD variables here. */
     5452                continue;
     5453
    54465454            if (   idxReg < RT_ELEMENTS(pReNative->Core.aHstSimdRegs)
    54475455                && (RT_BIT_32(idxReg) & fRegMask)
    54485456                && (  iLoop == 0
    5449                     ? pReNative->Core.aSimdVars[idxVar].enmKind != kIemNativeVarKind_Stack
    5450                     : pReNative->Core.aSimdVars[idxVar].enmKind == kIemNativeVarKind_Stack)
    5451                 && !pReNative->Core.aSimdVars[idxVar].fRegAcquired)
     5457                    ? pReNative->Core.aVars[idxVar].enmKind != kIemNativeVarKind_Stack
     5458                    : pReNative->Core.aVars[idxVar].enmKind == kIemNativeVarKind_Stack)
     5459                && !pReNative->Core.aVars[idxVar].fRegAcquired)
    54525460            {
    5453                 Assert(pReNative->Core.bmHstRegs & RT_BIT_32(idxReg));
     5461                Assert(pReNative->Core.bmHstSimdRegs & RT_BIT_32(idxReg));
    54545462                Assert(   (pReNative->Core.bmGstSimdRegShadows & pReNative->Core.aHstSimdRegs[idxReg].fGstRegShadows)
    54555463                       == pReNative->Core.aHstSimdRegs[idxReg].fGstRegShadows);
    5456                 Assert(pReNative->Core.bmGstSimdRegShadows < RT_BIT_64(kIemNativeGstReg_End));
    5457                 Assert(   RT_BOOL(pReNative->Core.bmHstRegsWithGstShadow & RT_BIT_32(idxReg))
     5464                Assert(pReNative->Core.bmGstSimdRegShadows < RT_BIT_64(kIemNativeGstSimdReg_End));
     5465                Assert(   RT_BOOL(pReNative->Core.bmHstSimdRegsWithGstShadow & RT_BIT_32(idxReg))
    54585466                       == RT_BOOL(pReNative->Core.aHstSimdRegs[idxReg].fGstRegShadows));
    54595467
    5460                 if (pReNative->Core.aSimdVars[idxVar].enmKind == kIemNativeVarKind_Stack)
     5468                if (pReNative->Core.aVars[idxVar].enmKind == kIemNativeVarKind_Stack)
    54615469                {
    54625470                    uint8_t const idxStackSlot = iemNativeVarGetStackSlot(pReNative, IEMNATIVE_VAR_IDX_PACK(idxVar));
     
    54645472                }
    54655473
    5466                 pReNative->Core.aSimdVars[idxVar].idxReg    = UINT8_MAX;
     5474                pReNative->Core.aVars[idxVar].idxReg        = UINT8_MAX;
    54675475                pReNative->Core.bmHstSimdRegs              &= ~RT_BIT_32(idxReg);
    54685476
    54695477                pReNative->Core.bmHstSimdRegsWithGstShadow &= ~RT_BIT_32(idxReg);
    5470                 pReNative->Core.bmGstSimdRegShadows        &= ~pReNative->Core.aHstSimdRegs[idxReg].fGstRegShadows;
     5478                pReNative->Core.bmGstSimdRegShadows        &= ~pReNative->Core.aHstRegs[idxReg].fGstRegShadows;
    54715479                pReNative->Core.aHstSimdRegs[idxReg].fGstRegShadows = 0;
    54725480                return idxReg;
     
    54755483        }
    54765484    }
    5477 #endif
    54785485
    54795486    AssertFailed();
  • trunk/src/VBox/VMM/VMMR3/IEMR3.cpp

    r103888 r103964  
    543543
    544544#ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR
     545        STAMR3RegisterF(pVM, &pVCpu->iem.s.StatNativeSimdRegFindFree, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     546                        "Number of calls to iemNativeSimdRegAllocFindFree.",
     547                        "/IEM/CPU%u/re/NativeSimdRegFindFree", idCpu);
     548        STAMR3RegisterF(pVM, &pVCpu->iem.s.StatNativeSimdRegFindFreeVar, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     549                        "Number of times iemNativeSimdRegAllocFindFree needed to free a variable.",
     550                        "/IEM/CPU%u/re/NativeSimdRegFindFreeVar", idCpu);
     551        STAMR3RegisterF(pVM, &pVCpu->iem.s.StatNativeSimdRegFindFreeNoVar, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     552                        "Number of times iemNativeSimdRegAllocFindFree did not needed to free any variables.",
     553                        "/IEM/CPU%u/re/NativeSimdRegFindFreeNoVar", idCpu);
     554        STAMR3RegisterF(pVM, &pVCpu->iem.s.StatNativeSimdRegFindFreeLivenessUnshadowed, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     555                        "Times liveness info freeed up shadowed guest registers in iemNativeSimdRegAllocFindFree.",
     556                        "/IEM/CPU%u/re/NativeSimdRegFindFreeLivenessUnshadowed", idCpu);
     557        STAMR3RegisterF(pVM, &pVCpu->iem.s.StatNativeSimdRegFindFreeLivenessHelped,    STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     558                        "Times liveness info helped finding the return register in iemNativeSimdRegAllocFindFree.",
     559                        "/IEM/CPU%u/re/NativeSimdRegFindFreeLivenessHelped", idCpu);
     560
    545561        STAMR3RegisterF(pVM, &pVCpu->iem.s.StatNativeMaybeDeviceNotAvailXcptCheckPotential, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Potential IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE() checks", "/IEM/CPU%u/re/NativeMaybeDeviceNotAvailXcptCheckPotential", idCpu);
    546562        STAMR3RegisterF(pVM, &pVCpu->iem.s.StatNativeMaybeSseXcptCheckPotential,            STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Potential IEM_MC_MAYBE_RAISE_SSE_RELATED_XCPT() checks",     "/IEM/CPU%u/re/NativeMaybeSseXcptCheckPotential", idCpu);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r103955 r103964  
    19011901
    19021902#ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR
     1903    /** Native recompiler: Number of calls to iemNativeSimdRegAllocFindFree. */
     1904    STAMCOUNTER             StatNativeSimdRegFindFree;
     1905    /** Native recompiler: Number of times iemNativeSimdRegAllocFindFree needed
     1906     *  to free a variable. */
     1907    STAMCOUNTER             StatNativeSimdRegFindFreeVar;
     1908    /** Native recompiler: Number of times iemNativeSimdRegAllocFindFree did
     1909     *  not need to free any variables. */
     1910    STAMCOUNTER             StatNativeSimdRegFindFreeNoVar;
     1911    /** Native recompiler: Liveness info freed shadowed guest registers in
     1912     * iemNativeSimdRegAllocFindFree. */
     1913    STAMCOUNTER             StatNativeSimdRegFindFreeLivenessUnshadowed;
     1914    /** Native recompiler: Liveness info helped with the allocation in
     1915     *  iemNativeSimdRegAllocFindFree. */
     1916    STAMCOUNTER             StatNativeSimdRegFindFreeLivenessHelped;
     1917
    19031918    /** Native recompiler: Number of potential IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE() checks. */
    19041919    STAMCOUNTER             StatNativeMaybeDeviceNotAvailXcptCheckPotential;
     
    19161931#endif
    19171932
    1918     uint64_t                au64Padding[2];
     1933    uint64_t                au64Padding[5];
    19191934    /** @} */
    19201935
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