VirtualBox

Changeset 104101 in vbox


Ignore:
Timestamp:
Mar 28, 2024 7:25:23 AM (12 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162504
Message:

VMM/IEM: Get rid of the inefficient looping when flushing dirty guest registers and use ASMBitFirstSetU64() to find the first set bit just like everywhere else, bugref:10614 bugref:10629

File:
1 edited

Legend:

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

    r104100 r104101  
    41584158
    41594159        uint64_t bmGstRegShadowDirty = pReNative->Core.bmGstRegShadowDirty & fGstRegShadows;
    4160         uint32_t idxGstReg = 0;
    41614160        do
    41624161        {
    4163             if (bmGstRegShadowDirty & 0x1)
    4164             {
    4165                 off = iemNativeRegFlushPendingWrite(pReNative, off, (IEMNATIVEGSTREG)idxGstReg);
    4166                 Assert(!(pReNative->Core.bmGstRegShadowDirty & RT_BIT_64(idxGstReg)));
    4167             }
    4168             idxGstReg++;
    4169             bmGstRegShadowDirty >>= 1;
     4162            unsigned const idxGstReg = ASMBitFirstSetU64(bmGstRegShadowDirty) - 1;
     4163            bmGstRegShadowDirty &= ~RT_BIT_64(idxGstReg);
     4164            off = iemNativeRegFlushPendingWrite(pReNative, off, (IEMNATIVEGSTREG)idxGstReg);
     4165            Assert(!(pReNative->Core.bmGstRegShadowDirty & RT_BIT_64(idxGstReg)));
    41704166        } while (bmGstRegShadowDirty);
    41714167    }
     
    58865882# endif
    58875883
    5888         uint32_t idxGstSimdReg = 0;
    58895884        do
    58905885        {
    5891             if (bmGstSimdRegShadowDirty & 0x1)
    5892                 off = iemNativeSimdRegFlushPendingWrite(pReNative, off, IEMNATIVEGSTSIMDREG_SIMD(idxGstSimdReg));
    5893 
    5894             idxGstSimdReg++;
    5895             bmGstSimdRegShadowDirty >>= 1;
     5886            unsigned const idxGstSimdReg = ASMBitFirstSetU64(bmGstSimdRegShadowDirty) - 1;
     5887            bmGstSimdRegShadowDirty &= ~RT_BIT_64(idxGstSimdReg);
     5888            off = iemNativeSimdRegFlushPendingWrite(pReNative, off, IEMNATIVEGSTSIMDREG_SIMD(idxGstSimdReg));
    58965889        } while (bmGstSimdRegShadowDirty);
    58975890    }
     
    59245917# endif
    59255918
    5926         uint32_t idxGstSimdReg = 0;
    59275919        do
    59285920        {
    5929             if (bmGstSimdRegShadowDirty & 0x1)
    5930                 off = iemNativeSimdRegFlushPendingWrite(pReNative, off, IEMNATIVEGSTSIMDREG_SIMD(idxGstSimdReg));
    5931 
    5932             idxGstSimdReg++;
    5933             bmGstSimdRegShadowDirty >>= 1;
     5921            unsigned const idxGstSimdReg = ASMBitFirstSetU64(bmGstSimdRegShadowDirty) - 1;
     5922            bmGstSimdRegShadowDirty &= ~RT_BIT_64(idxGstSimdReg);
     5923            off = iemNativeSimdRegFlushPendingWrite(pReNative, off, IEMNATIVEGSTSIMDREG_SIMD(idxGstSimdReg));
     5924            Assert(!IEMNATIVE_SIMD_REG_STATE_IS_DIRTY_U256(pReNative, idxGstSimdReg));
    59345925        } while (bmGstSimdRegShadowDirty);
    59355926    }
     
    60316022
    60326023        /* We need to flush any pending guest register writes this host SIMD register shadows. */
    6033         uint32_t fGstRegShadows = pReNative->Core.aHstSimdRegs[idxReg].fGstRegShadows;
    6034         uint32_t idxGstSimdReg = 0;
    6035         do
    6036         {
    6037             if (fGstRegShadows & 0x1)
    6038             {
    6039                 *poff = iemNativeSimdRegFlushPendingWrite(pReNative, *poff, IEMNATIVEGSTSIMDREG_SIMD(idxGstSimdReg));
    6040                 Assert(!IEMNATIVE_SIMD_REG_STATE_IS_DIRTY_U256(pReNative, idxGstSimdReg));
    6041             }
    6042             idxGstSimdReg++;
    6043             fGstRegShadows >>= 1;
    6044         } while (fGstRegShadows);
     6024        *poff = iemNativeSimdRegFlushDirtyGuestByHostSimdRegShadow(pReNative, *poff, idxReg);
    60456025
    60466026        pReNative->Core.bmHstSimdRegsWithGstShadow &= ~RT_BIT_32(idxReg);
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