Changeset 103334 in vbox for trunk/src/VBox
- Timestamp:
- Feb 13, 2024 1:45:51 PM (12 months ago)
- svn:sync-xref-src-repo-rev:
- 161641
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllN8veLiveness.cpp
r103318 r103334 51 51 * BEGIN & END as well as internal workers. 52 52 */ 53 #ifdef IEMLIVENESS_OLD_LAYOUT 54 # define IEM_MC_BEGIN(a_cArgs, a_cLocals, a_fMcFlags, a_fCImplFlags) \ 55 { \ 56 /* Define local variables that we use to accumulate the liveness state changes in. */ \ 57 IEMLIVENESSPART1 LiveStatePart1 = { 0 }; \ 58 IEMLIVENESSPART2 LiveStatePart2 = { 0 }; \ 59 IEMLIVENESSPART1 LiveMaskPart1 = { 0 }; \ 60 IEMLIVENESSPART2 LiveMaskPart2 = { 0 }; \ 61 bool fDoneXpctOrCall = false 62 #else 63 # define IEM_MC_BEGIN(a_cArgs, a_cLocals, a_fMcFlags, a_fCImplFlags) \ 53 #define IEM_MC_BEGIN(a_cArgs, a_cLocals, a_fMcFlags, a_fCImplFlags) \ 64 54 { \ 65 55 /* Define local variables that we use to accumulate the liveness state changes in. */ \ … … 68 58 IEMLIVENESSBIT LiveMask = { 0 }; \ 69 59 bool fDoneXpctOrCall = false 70 #endif71 60 72 61 AssertCompile(IEMLIVENESS_STATE_INPUT == IEMLIVENESS_STATE_MASK); 73 #ifdef IEMLIVENESS_OLD_LAYOUT74 # define IEM_LIVENESS_MARK_XCPT_OR_CALL() do { \75 if (!fDoneXpctOrCall) \76 { \77 uint64_t uTmp0 = pIncoming->s1.bm64 & ~LiveMaskPart1.bm64; \78 uTmp0 = uTmp0 & (uTmp0 >> 1); \79 LiveStatePart1.bm64 |= uTmp0 | IEMLIVENESSPART1_XCPT_OR_CALL; \80 \81 uint64_t uTmp1 = pIncoming->s2.bm64 & ~LiveMaskPart2.bm64; \82 uTmp1 = uTmp1 & (uTmp1 >> 1); \83 LiveStatePart2.bm64 |= uTmp1 | IEMLIVENESSPART2_XCPT_OR_CALL; \84 \85 LiveMaskPart1.bm64 |= IEMLIVENESSPART1_MASK; /* could also use UINT64_MAX here, but makes no difference */ \86 LiveMaskPart2.bm64 |= IEMLIVENESSPART2_MASK; /* when compiling with gcc and cl.exe on x86 - may on arm, though. */ \87 fDoneXpctOrCall = true; \88 } \89 } while (0)90 #else91 62 AssertCompile(IEMLIVENESSBIT0_XCPT_OR_CALL == 0 && IEMLIVENESSBIT1_XCPT_OR_CALL != 0); 92 # 63 #define IEM_LIVENESS_MARK_XCPT_OR_CALL() do { \ 93 64 if (!fDoneXpctOrCall) \ 94 65 { \ … … 100 71 } \ 101 72 } while (0) 102 #endif103 73 104 74 105 75 AssertCompile(IEMLIVENESS_STATE_CLOBBERED == 0); 106 #ifdef IEMLIVENESS_OLD_LAYOUT 107 # define IEM_LIVENESS_ALL_EFLAGS_CLOBBERED() do { \ 108 LiveMaskPart2.bm64 |= IEMLIVENESSPART2_ALL_EFL_MASK; \ 109 } while (0) 110 AssertCompile(IEMLIVENESSPART1_ALL_EFL_MASK == 0); 111 # define IEM_LIVENESS_ALL_EFLAGS_INPUT() do { \ 112 LiveMaskPart2.bm64 |= IEMLIVENESSPART2_ALL_EFL_MASK; \ 113 LiveStatePart2.bm64 |= IEMLIVENESSPART2_ALL_EFL_INPUT; \ 114 } while (0) 115 #else 116 # define IEM_LIVENESS_ALL_EFLAGS_CLOBBERED() do { \ 76 #define IEM_LIVENESS_ALL_EFLAGS_CLOBBERED() do { \ 117 77 LiveMask.bm64 |= IEMLIVENESSBIT_ALL_EFL_MASK; \ 118 78 } while (0) 119 79 AssertCompile(IEMLIVENESS_STATE_INPUT == IEMLIVENESS_STATE_MASK); 120 # 80 #define IEM_LIVENESS_ALL_EFLAGS_INPUT() do { \ 121 81 LiveStateBit0.bm64 |= IEMLIVENESSBIT_ALL_EFL_MASK; \ 122 82 LiveStateBit1.bm64 |= IEMLIVENESSBIT_ALL_EFL_MASK; \ 123 83 LiveMask.bm64 |= IEMLIVENESSBIT_ALL_EFL_MASK; \ 124 84 } while (0) 125 #endif 126 127 128 #ifdef IEMLIVENESS_OLD_LAYOUT 129 # define IEM_LIVENESS_ONE_EFLAG_CLOBBERED(a_Name) do { \ 130 LiveMaskPart2.a_Name |= IEMLIVENESS_STATE_MASK; \ 131 } while (0) 132 # define IEM_LIVENESS_ONE_EFLAG_INPUT(a_Name) do { \ 133 LiveMaskPart2.a_Name |= IEMLIVENESS_STATE_MASK; \ 134 LiveStatePart2.a_Name |= IEMLIVENESS_STATE_INPUT; \ 135 } while (0) 136 #else 137 # define IEM_LIVENESS_ONE_EFLAG_CLOBBERED(a_Name) do { \ 85 86 87 #define IEM_LIVENESS_ONE_EFLAG_CLOBBERED(a_Name) do { \ 138 88 LiveMask.a_Name |= 1; \ 139 89 } while (0) 140 # 90 #define IEM_LIVENESS_ONE_EFLAG_INPUT(a_Name) do { \ 141 91 LiveStateBit0.a_Name |= 1; \ 142 92 LiveStateBit1.a_Name |= 1; \ 143 93 LiveMask.a_Name |= 1; \ 144 94 } while (0) 145 #endif146 95 147 96 148 97 /* Generic bitmap (bmGpr, bmSegBase, ++) setters. */ 149 #ifdef IEMLIVENESS_OLD_LAYOUT 150 # define IEM_LIVENESS_BITMAP_MEMBER_CLOBBERED(a_Part, a_bmMember, a_iElement) do { \ 151 LiveMaskPart##a_Part.a_bmMember |= (uint32_t)IEMLIVENESS_STATE_MASK << ((a_iElement) * IEMLIVENESS_STATE_BIT_COUNT); \ 152 } while (0) 153 # define IEM_LIVENESS_BITMAP_MEMBER_INPUT(a_Part, a_bmMember, a_iElement) do { \ 154 LiveMaskPart##a_Part.a_bmMember |= (uint32_t)IEMLIVENESS_STATE_MASK << ((a_iElement) * IEMLIVENESS_STATE_BIT_COUNT); \ 155 LiveStatePart##a_Part.a_bmMember |= (uint32_t)IEMLIVENESS_STATE_INPUT << ((a_iElement) * IEMLIVENESS_STATE_BIT_COUNT); \ 156 } while (0) 157 #else 158 # define IEM_LIVENESS_BITMAP_MEMBER_CLOBBERED(a_Part, a_bmMember, a_iElement) do { \ 98 #define IEM_LIVENESS_BITMAP_MEMBER_CLOBBERED(a_Part, a_bmMember, a_iElement) do { \ 159 99 LiveMask.a_bmMember |= RT_BIT_64(a_iElement); \ 160 100 } while (0) 161 # 101 #define IEM_LIVENESS_BITMAP_MEMBER_INPUT(a_Part, a_bmMember, a_iElement) do { \ 162 102 LiveStateBit0.a_bmMember |= RT_BIT_64(a_iElement); \ 163 103 LiveStateBit1.a_bmMember |= RT_BIT_64(a_iElement); \ 164 104 LiveMask.a_bmMember |= RT_BIT_64(a_iElement); \ 165 105 } while (0) 166 #endif167 106 168 107 … … 216 155 #define IEM_LIVENESS_PC64_JMP_WITH_FLAGS() IEM_LIVENESS_MARK_XCPT_OR_CALL(); IEM_LIVENESS_ONE_EFLAG_INPUT(fEflOther) 217 156 218 #ifdef IEMLIVENESS_OLD_LAYOUT 219 # define IEM_MC_END() \ 220 /* Combine the incoming state with what we've accumulated in this block. */ \ 221 /* We can help the compiler by skipping OR'ing when having applied XPCT_OR_CALL, */ \ 222 /* since that already imports all the incoming state. Saves a lot with cl.exe. */ \ 223 if (!fDoneXpctOrCall) \ 224 { \ 225 pOutgoing->s1.bm64 = LiveStatePart1.bm64 | (~LiveMaskPart1.bm64 & pIncoming->s1.bm64); \ 226 pOutgoing->s2.bm64 = LiveStatePart2.bm64 | (~LiveMaskPart2.bm64 & pIncoming->s2.bm64); \ 227 } \ 228 else \ 229 { \ 230 pOutgoing->s1.bm64 = LiveStatePart1.bm64; \ 231 pOutgoing->s2.bm64 = LiveStatePart2.bm64; \ 232 } \ 233 } 234 #else 235 # define IEM_MC_END() \ 157 #define IEM_MC_END() \ 236 158 /* Combine the incoming state with what we've accumulated in this block. */ \ 237 159 /* We can help the compiler by skipping OR'ing when having applied XPCT_OR_CALL, */ \ … … 248 170 } \ 249 171 } 250 #endif251 172 252 173 /* -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp
r103318 r103334 3622 3622 3623 3623 /* Construct a mask of the guest registers in the UNUSED and XCPT_OR_CALL state. */ 3624 # ifdef IEMLIVENESS_OLD_LAYOUT3625 3624 AssertCompile(IEMLIVENESS_STATE_UNUSED == 1 && IEMLIVENESS_STATE_XCPT_OR_CALL == 2); 3626 uint64_t fToFreeMask = 0; 3627 uint64_t fTmp = pLivenessEntry->s1.bm64; 3628 fTmp ^= fTmp >> 1; 3629 for (unsigned iReg = 0; i < 32; i++) 3630 fToFreeMask = ((fTmp >> (iReg * IEMLIVENESS_STATE_BIT_COUNT)) & 1) << iReg; 3631 3632 IEMLIVENESSPART2 Part2 = pLivenessEntry->s2; 3633 Part2.fEflOther &= Part2.fEflCf; /** @todo optimize this */ 3634 Part2.fEflOther &= Part2.fEflPf; 3635 Part2.fEflOther &= Part2.fEflAf; 3636 Part2.fEflOther &= Part2.fEflZf; 3637 Part2.fEflOther &= Part2.fEflSf; 3638 Part2.fEflOther &= Part2.fEflOf; 3639 fTmp = pLivenessEntry->s2.bm64; 3640 fTmp ^= fTmp >> 1; 3641 for (unsigned iReg = 0; i < IEMLIVENESSPART2_REG_COUNT - 6; i++) 3642 fToFreeMask = ((fTmp >> (iReg * IEMLIVENESS_STATE_BIT_COUNT)) & 1) << (iReg + 32); 3643 # else 3644 AssertCompile(IEMLIVENESS_STATE_UNUSED == 1 && IEMLIVENESS_STATE_XCPT_OR_CALL == 2); 3645 # if 0 3625 # if 0 3646 3626 IEMLIVENESSBIT Tmp = { pLivenessEntry->Bit0.bm64 ^ pLivenessEntry->Bit1.bm64 }; /* mask of regs in either UNUSED */ 3647 3627 Tmp.fEflOther &= Tmp.fEflCf; /** @todo optimize this (pair of 3 (status), pair of 4 (in other), pair of 2, pair of 1). */ … … 3658 3638 Tmp.fEflOf = 0; 3659 3639 uint64_t fToFreeMask = Tmp.bm64; 3660 # 3640 # else 3661 3641 uint64_t fToFreeMask = pLivenessEntry->Bit0.bm64 ^ pLivenessEntry->Bit1.bm64; /* mask of regs in either UNUSED */ 3662 3642 uint64_t fTmp = fToFreeMask & (fToFreeMask >> 3); /* AF2,PF2,CF2,Other2 = AF,PF,CF,Other & OF,SF,ZF,AF */ … … 3665 3645 fToFreeMask &= RT_BIT_64(kIemNativeGstReg_EFlags) - 1; 3666 3646 fToFreeMask |= fTmp & RT_BIT_64(kIemNativeGstReg_EFlags); 3667 # endif3668 3647 # endif 3669 3648 … … 4037 4016 iemNativeLivenessGetStateByGstRegEx(PCIEMLIVENESSENTRY pLivenessEntry, unsigned enmGstRegEx) 4038 4017 { 4039 #ifdef IEMLIVENESS_OLD_LAYOUT4040 if ((unsigned)enmGstRegEx < 32)4041 return (pLivenessEntry->s1.bm64 >> (enmGstRegEx * IEMLIVENESS_STATE_BIT_COUNT)) & IEMLIVENESS_STATE_MASK;4042 return (pLivenessEntry->s2.bm64 >> ((enmGstRegEx - 32) * IEMLIVENESS_STATE_BIT_COUNT)) & IEMLIVENESS_STATE_MASK;4043 #else4044 4018 return ((pLivenessEntry->Bit0.bm64 >> enmGstRegEx) & 1) 4045 4019 | (((pLivenessEntry->Bit1.bm64 >> enmGstRegEx) << 1) & 2); 4046 #endif4047 4020 } 4048 4021 … … 4051 4024 iemNativeLivenessGetStateByGstReg(PCIEMLIVENESSENTRY pLivenessEntry, IEMNATIVEGSTREG enmGstReg) 4052 4025 { 4053 #ifdef IEMLIVENESS_OLD_LAYOUT4054 uint32_t uRet;4055 if ((unsigned)enmGstReg < 32)4056 uRet = (pLivenessEntry->s1.bm64 >> ((unsigned)enmGstReg * IEMLIVENESS_STATE_BIT_COUNT)) & IEMLIVENESS_STATE_MASK;4057 else4058 {4059 uRet = (pLivenessEntry->s2.bm64 >> (((unsigned)enmGstReg - 32) * IEMLIVENESS_STATE_BIT_COUNT)) & IEMLIVENESS_STATE_MASK;4060 if (enmGstReg == kIemNativeGstReg_EFlags)4061 {4062 /* Merge the eflags states to one. */4063 uRet = RT_BIT_32(uRet);4064 uRet |= RT_BIT_32(pLivenessEntry->s2.fEflCf);4065 uRet |= RT_BIT_32(pLivenessEntry->s2.fEflPf);4066 uRet |= RT_BIT_32(pLivenessEntry->s2.fEflAf);4067 uRet |= RT_BIT_32(pLivenessEntry->s2.fEflZf);4068 uRet |= RT_BIT_32(pLivenessEntry->s2.fEflSf);4069 uRet |= RT_BIT_32(pLivenessEntry->s2.fEflOf);4070 uRet = iemNativeLivenessMergeExpandedEFlagsState(uRet);4071 }4072 }4073 #else4074 4026 uint32_t uRet = ((pLivenessEntry->Bit0.bm64 >> (unsigned)enmGstReg) & 1) 4075 4027 | (((pLivenessEntry->Bit1.bm64 >> (unsigned)enmGstReg) << 1) & 2); … … 4086 4038 uRet = iemNativeLivenessMergeExpandedEFlagsState(uRet); 4087 4039 } 4088 #endif4089 4040 return uRet; 4090 4041 } … … 9830 9781 { 9831 9782 PVMCPUCC const pVCpu = pReNative->pVCpu; 9832 # ifdef IEMLIVENESS_OLD_LAYOUT9833 IEMLIVENESSPART2 const LivenessInfo2 = pReNative->paLivenessEntries[pReNative->idxCurCall].s2;9834 # define CHECK_FLAG_AND_UPDATE_STATS(a_fEfl, a_fLivenessMember, a_CoreStatName) \9835 if (fEflOutput & (a_fEfl)) \9836 { \9837 if (LivenessInfo2.a_fLivenessMember != IEMLIVENESS_STATE_CLOBBERED) \9838 STAM_COUNTER_INC(&pVCpu->iem.s. a_CoreStatName ## Required); \9839 else \9840 STAM_COUNTER_INC(&pVCpu->iem.s. a_CoreStatName ## Skippable); \9841 } else do { } while (0)9842 # else9843 9783 IEMLIVENESSBIT const LivenessBit0 = pReNative->paLivenessEntries[pReNative->idxCurCall].Bit0; 9844 9784 IEMLIVENESSBIT const LivenessBit1 = pReNative->paLivenessEntries[pReNative->idxCurCall].Bit1; 9845 9785 AssertCompile(IEMLIVENESS_STATE_CLOBBERED == 0); 9846 # 9786 # define CHECK_FLAG_AND_UPDATE_STATS(a_fEfl, a_fLivenessMember, a_CoreStatName) \ 9847 9787 if (fEflOutput & (a_fEfl)) \ 9848 9788 { \ … … 9852 9792 STAM_COUNTER_INC(&pVCpu->iem.s. a_CoreStatName ## Skippable); \ 9853 9793 } else do { } while (0) 9854 # endif9855 9794 CHECK_FLAG_AND_UPDATE_STATS(X86_EFL_CF, fEflCf, StatNativeLivenessEflCf); 9856 9795 CHECK_FLAG_AND_UPDATE_STATS(X86_EFL_PF, fEflPf, StatNativeLivenessEflPf); … … 13720 13659 /* The initial (final) entry. */ 13721 13660 idxCall--; 13722 # ifdef IEMLIVENESS_OLD_LAYOUT13723 paLivenessEntries[idxCall].s1.bm64 = IEMLIVENESSPART1_ALL_UNUSED;13724 paLivenessEntries[idxCall].s2.bm64 = IEMLIVENESSPART2_ALL_UNUSED;13725 # else13726 13661 paLivenessEntries[idxCall].Bit0.bm64 = IEMLIVENESSBIT0_ALL_UNUSED; 13727 13662 paLivenessEntries[idxCall].Bit1.bm64 = IEMLIVENESSBIT1_ALL_UNUSED; 13728 # endif13729 13663 13730 13664 /* Loop backwards thru the calls and fill in the other entries. */ -
trunk/src/VBox/VMM/include/IEMN8veRecompiler.h
r103318 r103334 381 381 typedef IEMNATIVEFIXUP *PIEMNATIVEFIXUP; 382 382 383 //#define IEMLIVENESS_OLD_LAYOUT384 #ifdef IEMLIVENESS_OLD_LAYOUT385 386 typedef union IEMLIVENESSPART1387 {388 uint64_t bm64;389 RT_GCC_EXTENSION struct390 { /* bit no */391 uint64_t bmGprs : 32; /**< 0x00 / 0: The 16 general purpose registers. */392 uint64_t fUnusedPc : 2; /**< 0x20 / 32: (PC in ) */393 uint64_t u6Padding : 6; /**< 0x22 / 34: */394 uint64_t bmSegBase : 12; /**< 0x28 / 40: */395 uint64_t bmSegAttrib : 12; /**< 0x34 / 52: */396 };397 } IEMLIVENESSPART1;398 AssertCompileSize(IEMLIVENESSPART1, 8);399 400 typedef union IEMLIVENESSPART2401 {402 uint64_t bm64;403 RT_GCC_EXTENSION struct404 { /* bit no */405 uint64_t bmSegLimit : 12; /**< 0x40 / 64: */406 uint64_t bmSegSel : 12; /**< 0x4c / 76: */407 uint64_t fEflOther : 2; /**< 0x58 / 88: Other EFLAGS bits (~X86_EFL_STATUS_BITS & X86_EFL_LIVE_MASK). First! */408 uint64_t fEflCf : 2; /**< 0x5a / 90: Carry flag (X86_EFL_CF / 0). */409 uint64_t fEflPf : 2; /**< 0x5c / 92: Parity flag (X86_EFL_PF / 2). */410 uint64_t fEflAf : 2; /**< 0x5e / 94: Auxilary carry flag (X86_EFL_AF / 4). */411 uint64_t fEflZf : 2; /**< 0x60 / 96: Zero flag (X86_EFL_ZF / 6). */412 uint64_t fEflSf : 2; /**< 0x62 / 98: Signed flag (X86_EFL_SF / 7). */413 uint64_t fEflOf : 2; /**< 0x64 /100: Overflow flag (X86_EFL_OF / 12). */414 uint64_t u24Unused : 26; /* 0x66 /102 -> 0x80/128 */415 };416 } IEMLIVENESSPART2;417 AssertCompileSize(IEMLIVENESSPART2, 8);418 # define IEMLIVENESSPART2_REG_COUNT 19419 420 #else421 383 422 384 /** … … 451 413 AssertCompileSize(IEMLIVENESSBIT, 8); 452 414 453 #endif454 415 455 416 /** … … 468 429 RT_GCC_EXTENSION struct 469 430 { 470 #ifdef IEMLIVENESS_OLD_LAYOUT471 IEMLIVENESSPART1 s1;472 IEMLIVENESSPART2 s2;473 #else474 431 /** Bit \#0 of the register states. */ 475 432 IEMLIVENESSBIT Bit0; 476 433 /** Bit \#1 of the register states. */ 477 434 IEMLIVENESSBIT Bit1; 478 #endif479 435 }; 480 436 } IEMLIVENESSENTRY; … … 487 443 /** @name 64-bit value masks for IEMLIVENESSENTRY. 488 444 * @{ */ /* 0xzzzzyyyyxxxxwwww */ 489 #ifdef IEMLIVENESS_OLD_LAYOUT 490 # define IEMLIVENESSPART1_MASK UINT64_C(0xffffff00ffffffff) 491 # define IEMLIVENESSPART2_MASK UINT64_C(0x0000003fffffffff) 492 #else 493 # define IEMLIVENESSBIT_MASK UINT64_C(0x0007fffffff0ffff) 494 #endif 495 496 #ifdef IEMLIVENESS_OLD_LAYOUT 497 # define IEMLIVENESSPART1_XCPT_OR_CALL UINT64_C(0xaaaaaa00aaaaaaaa) 498 # define IEMLIVENESSPART2_XCPT_OR_CALL UINT64_C(0x0000002aaaaaaaaa) 499 #else 500 # define IEMLIVENESSBIT0_XCPT_OR_CALL UINT64_C(0x0000000000000000) 501 # define IEMLIVENESSBIT1_XCPT_OR_CALL IEMLIVENESSBIT_MASK 502 #endif 503 504 #ifdef IEMLIVENESS_OLD_LAYOUT 505 # define IEMLIVENESSPART1_ALL_UNUSED UINT64_C(0x5555550055555555) 506 # define IEMLIVENESSPART2_ALL_UNUSED UINT64_C(0x0000001555555555) 507 #else 508 # define IEMLIVENESSBIT0_ALL_UNUSED IEMLIVENESSBIT_MASK 509 # define IEMLIVENESSBIT1_ALL_UNUSED UINT64_C(0x0000000000000000) 510 #endif 511 512 #ifdef IEMLIVENESS_OLD_LAYOUT 513 # define IEMLIVENESSPART1_ALL_EFL_MASK UINT64_C(0x0000000000000000) 514 # define IEMLIVENESSPART2_ALL_EFL_MASK UINT64_C(0x0000003fff000000) 515 #else 516 # define IEMLIVENESSBIT_ALL_EFL_MASK UINT64_C(0x0007f00000000000) 517 #endif 518 519 #ifdef IEMLIVENESS_OLD_LAYOUT 520 # define IEMLIVENESSPART1_ALL_EFL_INPUT IEMLIVENESSPART1_ALL_EFL_MASK 521 # define IEMLIVENESSPART2_ALL_EFL_INPUT IEMLIVENESSPART2_ALL_EFL_MASK 522 #else 523 # define IEMLIVENESSBIT0_ALL_EFL_INPUT IEMLIVENESSBIT_ALL_EFL_MASK 524 # define IEMLIVENESSBIT1_ALL_EFL_INPUT IEMLIVENESSBIT_ALL_EFL_MASK 525 #endif 445 #define IEMLIVENESSBIT_MASK UINT64_C(0x0007fffffff0ffff) 446 447 #define IEMLIVENESSBIT0_XCPT_OR_CALL UINT64_C(0x0000000000000000) 448 #define IEMLIVENESSBIT1_XCPT_OR_CALL IEMLIVENESSBIT_MASK 449 450 #define IEMLIVENESSBIT0_ALL_UNUSED IEMLIVENESSBIT_MASK 451 #define IEMLIVENESSBIT1_ALL_UNUSED UINT64_C(0x0000000000000000) 452 453 #define IEMLIVENESSBIT_ALL_EFL_MASK UINT64_C(0x0007f00000000000) 454 455 #define IEMLIVENESSBIT0_ALL_EFL_INPUT IEMLIVENESSBIT_ALL_EFL_MASK 456 #define IEMLIVENESSBIT1_ALL_EFL_INPUT IEMLIVENESSBIT_ALL_EFL_MASK 526 457 /** @} */ 527 458 … … 604 535 /** Initializing the outgoing state with a potential xcpt or call state. 605 536 * This only works when all later changes will be IEMLIVENESS_STATE_INPUT. */ 606 #ifdef IEMLIVENESS_OLD_LAYOUT 607 # define IEM_LIVENESS_RAW_INIT_WITH_XCPT_OR_CALL(a_pOutgoing, a_pIncoming) \ 608 do { \ 609 uint64_t uTmp1 = (a_pIncoming)->s1.bm64; \ 610 uTmp1 = uTmp1 & (uTmp1 >> 1); \ 611 (a_pOutgoing)->s1.bm64 = uTmp1 | IEMLIVENESSPART1_XCPT_OR_CALL; \ 612 \ 613 uint64_t uTmp2 = (a_pIncoming)->s2.bm64; \ 614 uTmp2 = uTmp2 & (uTmp1 >> 1); \ 615 (a_pOutgoing)->s2.bm64 = uTmp2 | IEMLIVENESSPART2_XCPT_OR_CALL; \ 616 } while (0) 617 #else 618 # define IEM_LIVENESS_RAW_INIT_WITH_XCPT_OR_CALL(a_pOutgoing, a_pIncoming) \ 537 #define IEM_LIVENESS_RAW_INIT_WITH_XCPT_OR_CALL(a_pOutgoing, a_pIncoming) \ 619 538 do { \ 620 539 (a_pOutgoing)->Bit0.bm64 = (a_pIncoming)->Bit0.bm64 & (a_pIncoming)->Bit1.bm64; \ 621 540 (a_pOutgoing)->Bit1.bm64 = IEMLIVENESSBIT1_XCPT_OR_CALL; \ 622 541 } while (0) 623 #endif624 542 625 543 /** Adds a segment base register as input to the outgoing state. */ 626 #ifdef IEMLIVENESS_OLD_LAYOUT 627 # define IEM_LIVENESS_RAW_SEG_BASE_INPUT(a_pOutgoing, a_iSReg) \ 628 (a_pOutgoing)->s1.bmSegBase |= (uint32_t)IEMLIVENESS_STATE_INPUT << ((a_iSReg) * IEMLIVENESS_STATE_BIT_COUNT) 629 #else 630 # define IEM_LIVENESS_RAW_SEG_BASE_INPUT(a_pOutgoing, a_iSReg) do { \ 544 #define IEM_LIVENESS_RAW_SEG_BASE_INPUT(a_pOutgoing, a_iSReg) do { \ 631 545 (a_pOutgoing)->Bit0.bmSegBase |= RT_BIT_64(a_iSReg); \ 632 546 (a_pOutgoing)->Bit1.bmSegBase |= RT_BIT_64(a_iSReg); \ 633 547 } while (0) 634 #endif635 548 636 549 /** Adds a segment attribute register as input to the outgoing state. */ 637 #ifdef IEMLIVENESS_OLD_LAYOUT 638 # define IEM_LIVENESS_RAW_SEG_ATTRIB_INPUT(a_pOutgoing, a_iSReg) \ 639 (a_pOutgoing)->s1.bmSegAttrib |= (uint32_t)IEMLIVENESS_STATE_INPUT << ((a_iSReg) * IEMLIVENESS_STATE_BIT_COUNT) 640 #else 641 # define IEM_LIVENESS_RAW_SEG_ATTRIB_INPUT(a_pOutgoing, a_iSReg) do { \ 550 #define IEM_LIVENESS_RAW_SEG_ATTRIB_INPUT(a_pOutgoing, a_iSReg) do { \ 642 551 (a_pOutgoing)->Bit0.bmSegAttrib |= RT_BIT_64(a_iSReg); \ 643 552 (a_pOutgoing)->Bit1.bmSegAttrib |= RT_BIT_64(a_iSReg); \ 644 553 } while (0) 645 #endif646 554 647 555 648 556 /** Adds a segment limit register as input to the outgoing state. */ 649 #ifdef IEMLIVENESS_OLD_LAYOUT 650 # define IEM_LIVENESS_RAW_SEG_LIMIT_INPUT(a_pOutgoing, a_iSReg) \ 651 (a_pOutgoing)->s2.bmSegLimit |= (uint32_t)IEMLIVENESS_STATE_INPUT << ((a_iSReg) * IEMLIVENESS_STATE_BIT_COUNT) 652 #else 653 # define IEM_LIVENESS_RAW_SEG_LIMIT_INPUT(a_pOutgoing, a_iSReg) do { \ 557 #define IEM_LIVENESS_RAW_SEG_LIMIT_INPUT(a_pOutgoing, a_iSReg) do { \ 654 558 (a_pOutgoing)->Bit0.bmSegLimit |= RT_BIT_64(a_iSReg); \ 655 559 (a_pOutgoing)->Bit1.bmSegLimit |= RT_BIT_64(a_iSReg); \ 656 560 } while (0) 657 #endif658 561 659 562 /** Adds a segment limit register as input to the outgoing state. */ 660 #ifdef IEMLIVENESS_OLD_LAYOUT 661 # define IEM_LIVENESS_RAW_EFLAGS_ONE_INPUT(a_pOutgoing, a_fEflMember) \ 662 (a_pOutgoing)->s2.a_fEflMember |= IEMLIVENESS_STATE_INPUT 663 #else 664 # define IEM_LIVENESS_RAW_EFLAGS_ONE_INPUT(a_pOutgoing, a_fEflMember) do { \ 563 #define IEM_LIVENESS_RAW_EFLAGS_ONE_INPUT(a_pOutgoing, a_fEflMember) do { \ 665 564 (a_pOutgoing)->Bit0.a_fEflMember |= 1; \ 666 565 (a_pOutgoing)->Bit1.a_fEflMember |= 1; \ 667 566 } while (0) 668 #endif669 567 /** @} */ 670 568
Note:
See TracChangeset
for help on using the changeset viewer.