Changeset 106078 in vbox for trunk/src/VBox/VMM/include
- Timestamp:
- Sep 17, 2024 7:41:52 PM (5 months ago)
- svn:sync-xref-src-repo-rev:
- 164845
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/include/IEMN8veRecompiler.h
r106061 r106078 774 774 * trickery to filter out IEMLIVENESS_STATE_UNUSED: 775 775 * 1. r0 = old & ~mask; 776 * 2. r0 = t1 & (t1 >> 1) '776 * 2. r0 = t1 & (t1 >> 1); 777 777 * 3. state |= r0 | 0b10; 778 778 * 4. mask = ~0; … … 795 795 /** The number of bits per state. */ 796 796 # define IEMLIVENESS_STATE_BIT_COUNT 2 797 797 798 /** Check if we're expecting read & write accesses to a register with the given (previous) liveness state. */ 798 799 # define IEMLIVENESS_STATE_IS_MODIFY_EXPECTED(a_uState) ((uint32_t)((a_uState) - 1U) >= (uint32_t)(IEMLIVENESS_STATE_INPUT - 1U)) … … 813 814 /** The register is not used any more. */ 814 815 # define IEMLIVENESS_STATE_UNUSED 0 815 /** Flag: The register is required in a potential exception or call. */816 # define IEMLIVENESS_STATE_POT _XCPT_OR_CALL1817 # define IEMLIVENESS_BIT_POT _XCPT_OR_CALL0816 /** 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 818 819 /** Flag: The register is read. */ 819 820 # define IEMLIVENESS_STATE_READ 2 … … 822 823 # define IEMLIVENESS_STATE_WRITE 4 823 824 # define IEMLIVENESS_BIT_WRITE 2 824 /** Flag: Unconditional call (not needed, can be redefined for research). */825 /** Flag: Unconditional call. */ 825 826 # define IEMLIVENESS_STATE_CALL 8 826 827 # define IEMLIVENESS_BIT_CALL 3 827 # define IEMLIVENESS_BIT_OTHER 3 /**< More convenient name for this one. */ 828 828 829 # define IEMLIVENESS_STATE_IS_MODIFY_EXPECTED(a_uState) \ 829 830 ( ((a_uState) & (IEMLIVENESS_STATE_WRITE | IEMLIVENESS_STATE_READ)) == (IEMLIVENESS_STATE_WRITE | IEMLIVENESS_STATE_READ) ) … … 833 834 # define IEMLIVENESS_STATE_ARE_STATUS_EFL_TO_BE_CLOBBERED(a_pCurEntry) \ 834 835 ( ((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) \ 836 839 & IEMLIVENESSBIT_STATUS_EFL_MASK) ) 837 840 … … 842 845 * 843 846 * These are not used by IEM_MC_BEGIN/END blocks, IEMAllN8veLiveness.cpp has its 844 * own set of mani mulator macros for those.847 * own set of manipulator macros for those. 845 848 * 846 849 * @{ */ … … 855 858 # define IEM_LIVENESS_RAW_INIT_AS_UNUSED(a_pOutgoing) \ 856 859 do { \ 857 (a_pOutgoing)->aBits[IEMLIVENESS_BIT_POT _XCPT_OR_CALL].bm64 = 0; \858 (a_pOutgoing)->aBits[IEMLIVENESS_BIT_READ 859 (a_pOutgoing)->aBits[IEMLIVENESS_BIT_WRITE 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; \ 861 864 } while (0) 862 865 #endif … … 865 868 * This only works when all later changes will be IEMLIVENESS_STATE_INPUT. */ 866 869 #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) \ 868 871 do { \ 869 872 (a_pOutgoing)->Bit0.bm64 = (a_pIncoming)->Bit0.bm64 & (a_pIncoming)->Bit1.bm64; \ … … 871 874 } while (0) 872 875 #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) \ 874 877 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; \ 879 919 } while (0) 880 920 #endif … … 2198 2238 | (((pLivenessEntry->Bit1.bm64 >> enmGstRegEx) << 1) & 2) 2199 2239 | (((pLivenessEntry->Bit2.bm64 >> enmGstRegEx) << 2) & 4) 2200 | (((pLivenessEntry->Bit3.bm64 >> enmGstRegEx) << 2) & 8);2240 | (((pLivenessEntry->Bit3.bm64 >> enmGstRegEx) << 3) & 8); 2201 2241 # endif 2202 2242 } … … 2234 2274 2235 2275 # 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. */ 2237 2277 DECL_FORCE_INLINE(uint32_t) 2238 2278 iemNativeLivenessGetPrevStateByGstReg(PIEMRECOMPILERSTATE pReNative, IEMNATIVEGSTREG enmGstReg)
Note:
See TracChangeset
for help on using the changeset viewer.