VirtualBox

Changeset 106078 in vbox for trunk/src/VBox/VMM/include


Ignore:
Timestamp:
Sep 17, 2024 7:41:52 PM (5 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164845
Message:

VMM/IEM: Liveness work for bugref:10720. bugref:10372

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/include/IEMN8veRecompiler.h

    r106061 r106078  
    774774 * trickery to filter out IEMLIVENESS_STATE_UNUSED:
    775775 *      1. r0 = old & ~mask;
    776  *      2. r0 = t1 & (t1 >> 1)'
     776 *      2. r0 = t1 & (t1 >> 1);
    777777 *      3. state |= r0 | 0b10;
    778778 *      4. mask = ~0;
     
    795795/** The number of bits per state.   */
    796796# define IEMLIVENESS_STATE_BIT_COUNT    2
     797
    797798/** Check if we're expecting read & write accesses to a register with the given (previous) liveness state. */
    798799# define IEMLIVENESS_STATE_IS_MODIFY_EXPECTED(a_uState)  ((uint32_t)((a_uState) - 1U) >= (uint32_t)(IEMLIVENESS_STATE_INPUT - 1U))
     
    813814/** The register is not used any more. */
    814815# define IEMLIVENESS_STATE_UNUSED           0
    815 /** Flag: The register is required in a potential exception or call. */
    816 # define IEMLIVENESS_STATE_POT_XCPT_OR_CALL 1
    817 # define IEMLIVENESS_BIT_POT_XCPT_OR_CALL   0
     816/** Flag: The register is required in a potential call or/and exception. */
     817# define IEMLIVENESS_STATE_POTENTIAL_CALL  1
     818# define IEMLIVENESS_BIT_POTENTIAL_CALL     0
    818819/** Flag: The register is read. */
    819820# define IEMLIVENESS_STATE_READ             2
     
    822823# define IEMLIVENESS_STATE_WRITE            4
    823824# define IEMLIVENESS_BIT_WRITE              2
    824 /** Flag: Unconditional call (not needed, can be redefined for research). */
     825/** Flag: Unconditional call. */
    825826# define IEMLIVENESS_STATE_CALL             8
    826827# define IEMLIVENESS_BIT_CALL               3
    827 # define IEMLIVENESS_BIT_OTHER              3   /**< More convenient name for this one. */
     828
    828829# define IEMLIVENESS_STATE_IS_MODIFY_EXPECTED(a_uState) \
    829830    ( ((a_uState) & (IEMLIVENESS_STATE_WRITE | IEMLIVENESS_STATE_READ)) == (IEMLIVENESS_STATE_WRITE | IEMLIVENESS_STATE_READ) )
     
    833834# define IEMLIVENESS_STATE_ARE_STATUS_EFL_TO_BE_CLOBBERED(a_pCurEntry)  \
    834835    (   ((a_pCurEntry)->aBits[IEMLIVENESS_BIT_WRITE].bm64 & IEMLIVENESSBIT_STATUS_EFL_MASK) == IEMLIVENESSBIT_STATUS_EFL_MASK \
    835      && !(  ((a_pCurEntry)->aBits[IEMLIVENESS_BIT_READ].bm64 | (a_pCurEntry)->aBits[IEMLIVENESS_BIT_POT_XCPT_OR_CALL].bm64) \
     836     && !(  (  (a_pCurEntry)->aBits[IEMLIVENESS_BIT_POTENTIAL_CALL].bm64 \
     837             | (a_pCurEntry)->aBits[IEMLIVENESS_BIT_READ].bm64 \
     838             | (a_pCurEntry)->aBits[IEMLIVENESS_BIT_CALL].bm64) \
    836839          & IEMLIVENESSBIT_STATUS_EFL_MASK) )
    837840
     
    842845 *
    843846 * These are not used by IEM_MC_BEGIN/END blocks, IEMAllN8veLiveness.cpp has its
    844  * own set of manimulator macros for those.
     847 * own set of manipulator macros for those.
    845848 *
    846849 * @{ */
     
    855858# define IEM_LIVENESS_RAW_INIT_AS_UNUSED(a_pOutgoing) \
    856859    do { \
    857         (a_pOutgoing)->aBits[IEMLIVENESS_BIT_POT_XCPT_OR_CALL].bm64 = 0; \
    858         (a_pOutgoing)->aBits[IEMLIVENESS_BIT_READ            ].bm64 = 0; \
    859         (a_pOutgoing)->aBits[IEMLIVENESS_BIT_WRITE           ].bm64 = 0; \
    860         (a_pOutgoing)->aBits[IEMLIVENESS_BIT_OTHER           ].bm64 = 0; \
     860        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_POTENTIAL_CALL].bm64 = 0; \
     861        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_READ          ].bm64 = 0; \
     862        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_WRITE         ].bm64 = 0; \
     863        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_CALL          ].bm64 = 0; \
    861864    } while (0)
    862865#endif
     
    865868 * This only works when all later changes will be IEMLIVENESS_STATE_INPUT. */
    866869#ifndef IEMLIVENESS_EXTENDED_LAYOUT
    867 # define IEM_LIVENESS_RAW_INIT_WITH_XCPT_OR_CALL(a_pOutgoing, a_pIncoming) \
     870# define IEM_LIVENESS_RAW_INIT_WITH_POTENTIAL_CALL(a_pOutgoing, a_pIncoming) \
    868871    do { \
    869872        (a_pOutgoing)->Bit0.bm64 = (a_pIncoming)->Bit0.bm64 & (a_pIncoming)->Bit1.bm64; \
     
    871874    } while (0)
    872875#else
    873 # define IEM_LIVENESS_RAW_INIT_WITH_XCPT_OR_CALL(a_pOutgoing, a_pIncoming) \
     876# define IEM_LIVENESS_RAW_INIT_WITH_POTENTIAL_CALL(a_pOutgoing, a_pIncoming) \
    874877    do { \
    875         (a_pOutgoing)->aBits[IEMLIVENESS_BIT_POT_XCPT_OR_CALL].bm64 = IEMLIVENESSBIT_MASK; \
    876         (a_pOutgoing)->aBits[IEMLIVENESS_BIT_READ            ].bm64 = (a_pIncoming)->aBits[IEMLIVENESS_BIT_READ].bm64; \
    877         (a_pOutgoing)->aBits[IEMLIVENESS_BIT_WRITE           ].bm64 = 0; \
    878         (a_pOutgoing)->aBits[IEMLIVENESS_BIT_OTHER           ].bm64 = 0; \
     878        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_POTENTIAL_CALL].bm64 = IEMLIVENESSBIT_MASK; \
     879        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_READ          ].bm64 = (a_pIncoming)->aBits[IEMLIVENESS_BIT_READ].bm64; \
     880        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_WRITE         ].bm64 = 0; \
     881        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_CALL          ].bm64 = 0; \
     882    } while (0)
     883#endif
     884
     885/** Initializing the outgoing state with an unconditional call state.
     886 * This only works when all later changes will be IEMLIVENESS_STATE_INPUT. */
     887#ifndef IEMLIVENESS_EXTENDED_LAYOUT
     888# define IEM_LIVENESS_RAW_INIT_WITH_CALL(a_pOutgoing, a_pIncoming) \
     889    do { \
     890        (a_pOutgoing)->Bit0.bm64 = (a_pIncoming)->Bit0.bm64 & (a_pIncoming)->Bit1.bm64; \
     891        (a_pOutgoing)->Bit1.bm64 = IEMLIVENESSBIT1_XCPT_OR_CALL; \
     892    } while (0)
     893#else
     894# define IEM_LIVENESS_RAW_INIT_WITH_CALL(a_pOutgoing, a_pIncoming) \
     895    do { \
     896        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_POTENTIAL_CALL].bm64 = 0; \
     897        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_READ          ].bm64 = (a_pIncoming)->aBits[IEMLIVENESS_BIT_READ].bm64; \
     898        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_WRITE         ].bm64 = 0; \
     899        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_CALL          ].bm64 = IEMLIVENESSBIT_MASK; \
     900    } while (0)
     901#endif
     902
     903/** Initializing the outgoing state with an unconditional call state as well as
     904 *  an potential call/exception preceeding it.
     905 * This should only be used alone, really. */
     906#ifndef IEMLIVENESS_EXTENDED_LAYOUT
     907# define IEM_LIVENESS_RAW_INIT_WITH_CALL_AND_POTENTIAL_CALL(a_pOutgoing, a_pIncoming) \
     908    do { \
     909        (a_pOutgoing)->Bit0.bm64 = (a_pIncoming)->Bit0.bm64 & (a_pIncoming)->Bit1.bm64; \
     910        (a_pOutgoing)->Bit1.bm64 = IEMLIVENESSBIT1_XCPT_OR_CALL; \
     911    } while (0)
     912#else
     913# define IEM_LIVENESS_RAW_INIT_WITH_CALL_AND_POTENTIAL_CALL(a_pOutgoing, a_pIncoming) \
     914    do { \
     915        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_POTENTIAL_CALL].bm64 = IEMLIVENESSBIT_MASK; \
     916        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_READ          ].bm64 = (a_pIncoming)->aBits[IEMLIVENESS_BIT_READ].bm64; \
     917        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_WRITE         ].bm64 = 0; \
     918        (a_pOutgoing)->aBits[IEMLIVENESS_BIT_CALL          ].bm64 = IEMLIVENESSBIT_MASK; \
    879919    } while (0)
    880920#endif
     
    21982238         | (((pLivenessEntry->Bit1.bm64 >> enmGstRegEx) << 1) & 2)
    21992239         | (((pLivenessEntry->Bit2.bm64 >> enmGstRegEx) << 2) & 4)
    2200          | (((pLivenessEntry->Bit3.bm64 >> enmGstRegEx) << 2) & 8);
     2240         | (((pLivenessEntry->Bit3.bm64 >> enmGstRegEx) << 3) & 8);
    22012241# endif
    22022242}
     
    22342274
    22352275# ifdef VBOX_STRICT
    2236 /** For assertions only, user checks that idxCurCall isn't zerow. */
     2276/** For assertions only - caller checks that idxCurCall isn't zero. */
    22372277DECL_FORCE_INLINE(uint32_t)
    22382278iemNativeLivenessGetPrevStateByGstReg(PIEMRECOMPILERSTATE pReNative, IEMNATIVEGSTREG enmGstReg)
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