VirtualBox

Ignore:
Timestamp:
Apr 4, 2024 10:47:23 AM (10 months ago)
Author:
vboxsync
Message:

VMM/IEM: Implement native emitters for IEM_MC_CLEAR_EFL_BIT(), IEM_MC_FLIP_EFL_BIT() and IEM_MC_SET_EFL_BIT(), bugref:10371

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h

    r104150 r104155  
    41444144}
    41454145
     4146
     4147typedef enum IEMNATIVEMITEFLOP
     4148{
     4149    kIemNativeEmitEflOp_Invalid = 0,
     4150    kIemNativeEmitEflOp_Set,
     4151    kIemNativeEmitEflOp_Clear,
     4152    kIemNativeEmitEflOp_Flip
     4153} IEMNATIVEMITEFLOP;
     4154
     4155#define IEM_MC_SET_EFL_BIT(a_fBit) \
     4156    off = iemNativeEmitModifyEFlagsBit(pReNative, off, a_fBit, kIemNativeEmitEflOp_Set);
     4157
     4158#define IEM_MC_CLEAR_EFL_BIT(a_fBit) \
     4159    off = iemNativeEmitModifyEFlagsBit(pReNative, off, a_fBit, kIemNativeEmitEflOp_Clear);
     4160
     4161#define IEM_MC_FLIP_EFL_BIT(a_fBit) \
     4162    off = iemNativeEmitModifyEFlagsBit(pReNative, off, a_fBit, kIemNativeEmitEflOp_Flip);
     4163
     4164/** Handles IEM_MC_SET_EFL_BIT/IEM_MC_CLEAR_EFL_BIT/IEM_MC_FLIP_EFL_BIT. */
     4165DECL_INLINE_THROW(uint32_t) iemNativeEmitModifyEFlagsBit(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint32_t fEflBit, IEMNATIVEMITEFLOP enmOp)
     4166{
     4167    uint8_t const idxEflReg = iemNativeRegAllocTmpForGuestReg(pReNative, &off, kIemNativeGstReg_EFlags,
     4168                                                              kIemNativeGstRegUse_ForUpdate, false /*fNoVolatileRegs*/);
     4169
     4170    switch (enmOp)
     4171    {
     4172        case kIemNativeEmitEflOp_Set:
     4173            off = iemNativeEmitOrGpr32ByImm(pReNative, off, idxEflReg, fEflBit);
     4174            break;
     4175        case kIemNativeEmitEflOp_Clear:
     4176            off = iemNativeEmitAndGpr32ByImm(pReNative, off, idxEflReg, ~fEflBit);
     4177            break;
     4178        case kIemNativeEmitEflOp_Flip:
     4179            off = iemNativeEmitXorGpr32ByImm(pReNative, off, idxEflReg, fEflBit);
     4180            break;
     4181        default:
     4182            AssertFailed();
     4183            break;
     4184    }
     4185
     4186    /** @todo No delayed writeback for EFLAGS right now. */
     4187    off = iemNativeEmitStoreGprToVCpuU32(pReNative, off, idxEflReg, RT_UOFFSETOF(VMCPU, cpum.GstCtx.eflags));
     4188
     4189    /* Free but don't flush the EFLAGS register. */
     4190    iemNativeRegFreeTmp(pReNative, idxEflReg);
     4191
     4192    return off;
     4193}
    41464194
    41474195
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