VirtualBox

Changeset 98975 in vbox for trunk


Ignore:
Timestamp:
Mar 15, 2023 10:05:22 AM (19 months ago)
Author:
vboxsync
Message:

VMM/IEM: More work on processing MC blocks, mainly related to reworking common functions for unary operations into body macros. bugref:10369

File:
1 edited

Legend:

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

    r98969 r98975  
    1163011630
    1163111631/**
    11632  * Common implementation of 'inc/dec/not/neg Eb'.
    11633  *
    11634  * @param   bRm             The RM byte.
    11635  * @param   pImpl           The instruction implementation.
    11636  */
    11637 FNIEMOP_DEF_2(iemOpCommonUnaryEb, uint8_t, bRm, PCIEMOPUNARYSIZES, pImpl)
    11638 {
    11639     if (IEM_IS_MODRM_REG_MODE(bRm))
    11640     {
    11641         /* register access */
    11642         IEM_MC_BEGIN(2, 0);
    11643         IEM_MC_ARG(uint8_t *,   pu8Dst, 0);
    11644         IEM_MC_ARG(uint32_t *,  pEFlags, 1);
    11645         IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, bRm));
    11646         IEM_MC_REF_EFLAGS(pEFlags);
    11647         IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU8, pu8Dst, pEFlags);
    11648         IEM_MC_ADVANCE_RIP_AND_FINISH();
    11649         IEM_MC_END();
    11650     }
    11651     else
    11652     {
    11653         /* memory access. */
    11654         IEM_MC_BEGIN(2, 2);
    11655         IEM_MC_ARG(uint8_t *,       pu8Dst,          0);
    11656         IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags, 1);
    11657         IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
    11658 
    11659         IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    11660         IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    11661         IEM_MC_FETCH_EFLAGS(EFlags);
    11662         if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK))
    11663             IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnNormalU8, pu8Dst, pEFlags);
    11664         else
    11665             IEM_MC_CALL_VOID_AIMPL_2(pImpl->pfnLockedU8, pu8Dst, pEFlags);
    11666 
    11667         IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW);
    11668         IEM_MC_COMMIT_EFLAGS(EFlags);
    11669         IEM_MC_ADVANCE_RIP_AND_FINISH();
    11670         IEM_MC_END();
    11671     }
    11672 }
     11632 * Body for of 'inc/dec/not/neg Eb'.
     11633 */
     11634#define IEMOP_BODY_UNARY_Eb(a_bRm, a_fnNormalU8, a_fnLockedU8) \
     11635    if (IEM_IS_MODRM_REG_MODE(a_bRm)) \
     11636    { \
     11637        /* register access */ \
     11638        IEMOP_HLP_DONE_DECODING(); \
     11639        IEM_MC_BEGIN(2, 0); \
     11640        IEM_MC_ARG(uint8_t *,   pu8Dst, 0); \
     11641        IEM_MC_ARG(uint32_t *,  pEFlags, 1); \
     11642        IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
     11643        IEM_MC_REF_EFLAGS(pEFlags); \
     11644        IEM_MC_CALL_VOID_AIMPL_2(a_fnNormalU8, pu8Dst, pEFlags); \
     11645        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     11646        IEM_MC_END(); \
     11647    } \
     11648    else \
     11649    { \
     11650        /* memory access. */ \
     11651        if (!(pVCpu->iem.s.fPrefixes & IEM_OP_PRF_LOCK)) \
     11652        { \
     11653            IEM_MC_BEGIN(2, 2); \
     11654            IEM_MC_ARG(uint8_t *,       pu8Dst,          0); \
     11655            IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags, 1); \
     11656            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
     11657            \
     11658            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     11659            IEMOP_HLP_DONE_DECODING(); \
     11660            IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/); \
     11661            IEM_MC_FETCH_EFLAGS(EFlags); \
     11662            IEM_MC_CALL_VOID_AIMPL_2(a_fnNormalU8, pu8Dst, pEFlags); \
     11663            \
     11664            IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW); \
     11665            IEM_MC_COMMIT_EFLAGS(EFlags); \
     11666            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     11667            IEM_MC_END(); \
     11668        } \
     11669        else \
     11670        { \
     11671            IEM_MC_BEGIN(2, 2); \
     11672            IEM_MC_ARG(uint8_t *,       pu8Dst,          0); \
     11673            IEM_MC_ARG_LOCAL_EFLAGS(    pEFlags, EFlags, 1); \
     11674            IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \
     11675            \
     11676            IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     11677            IEMOP_HLP_DONE_DECODING(); \
     11678            IEM_MC_MEM_MAP(pu8Dst, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/); \
     11679            IEM_MC_FETCH_EFLAGS(EFlags); \
     11680            IEM_MC_CALL_VOID_AIMPL_2(a_fnLockedU8, pu8Dst, pEFlags); \
     11681            \
     11682            IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Dst, IEM_ACCESS_DATA_RW); \
     11683            IEM_MC_COMMIT_EFLAGS(EFlags); \
     11684            IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     11685            IEM_MC_END(); \
     11686        } \
     11687    } \
     11688    (void)0
    1167311689
    1167411690
     
    1175311769
    1175411770
    11755 /** Opcode 0xf6 /0. */
     11771/**
     11772 * @opmaps  grp3_f6
     11773 * @opcode  /0
     11774 * @todo also /1
     11775 */
    1175611776FNIEMOP_DEF_1(iemOp_grp3_test_Eb, uint8_t, bRm)
    1175711777{
     
    1217712197}
    1217812198
     12199
     12200/**
     12201 * @opmaps  grp3_f6
     12202 * @opcode  /2
     12203 */
     12204FNIEMOP_DEF_1(iemOp_grp3_not_Eb, uint8_t, bRm)
     12205{
     12206    IEMOP_MNEMONIC(not_Eb, "not Eb");
     12207    IEMOP_BODY_UNARY_Eb(bRm, iemAImpl_not_u8, iemAImpl_not_u8_locked);
     12208}
     12209
     12210
     12211/**
     12212 * @opmaps  grp3_f6
     12213 * @opcode  /3
     12214 */
     12215FNIEMOP_DEF_1(iemOp_grp3_neg_Eb, uint8_t, bRm)
     12216{
     12217    IEMOP_MNEMONIC(net_Eb, "neg Eb");
     12218    IEMOP_BODY_UNARY_Eb(bRm, iemAImpl_neg_u8, iemAImpl_neg_u8_locked);
     12219}
     12220
     12221
    1217912222/**
    1218012223 * @opcode      0xf6
     
    1218512228    switch (IEM_GET_MODRM_REG_8(bRm))
    1218612229    {
    12187         case 0:
    12188             return FNIEMOP_CALL_1(iemOp_grp3_test_Eb, bRm);
    12189         case 1:
    12190 /** @todo testcase: Present on <=386, most 486 (not early), Pentiums, and current CPUs too. CPUUNDOC.EXE */
    12191             return IEMOP_RAISE_INVALID_OPCODE();
    12192         case 2:
    12193             IEMOP_MNEMONIC(not_Eb, "not Eb");
    12194             return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_not);
    12195         case 3:
    12196             IEMOP_MNEMONIC(neg_Eb, "neg Eb");
    12197             return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_neg);
     12230        case 0: return FNIEMOP_CALL_1(iemOp_grp3_test_Eb, bRm);
     12231        case 1: return FNIEMOP_CALL_1(iemOp_grp3_test_Eb, bRm);
     12232        case 2: return FNIEMOP_CALL_1(iemOp_grp3_not_Eb, bRm);
     12233        case 3: return FNIEMOP_CALL_1(iemOp_grp3_neg_Eb, bRm);
    1219812234        case 4:
    1219912235            IEMOP_MNEMONIC(mul_Eb, "mul Eb");
     
    1233312369
    1233412370/**
     12371 * @opmaps  grp4
     12372 * @opcode  /0
     12373 */
     12374FNIEMOP_DEF_1(iemOp_Grp4_inc_Eb, uint8_t, bRm)
     12375{
     12376    IEMOP_MNEMONIC(inc_Eb, "inc Eb");
     12377    IEMOP_BODY_UNARY_Eb(bRm, iemAImpl_inc_u8, iemAImpl_inc_u8_locked);
     12378}
     12379
     12380
     12381/**
     12382 * @opmaps  grp4
     12383 * @opcode  /1
     12384 */
     12385FNIEMOP_DEF_1(iemOp_Grp4_dec_Eb, uint8_t, bRm)
     12386{
     12387    IEMOP_MNEMONIC(dec_Eb, "dec Eb");
     12388    IEMOP_BODY_UNARY_Eb(bRm, iemAImpl_dec_u8, iemAImpl_dec_u8_locked);
     12389}
     12390
     12391
     12392/**
    1233512393 * @opcode      0xfe
    1233612394 */
     
    1234012398    switch (IEM_GET_MODRM_REG_8(bRm))
    1234112399    {
    12342         case 0:
    12343             IEMOP_MNEMONIC(inc_Eb, "inc Eb");
    12344             return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_inc);
    12345         case 1:
    12346             IEMOP_MNEMONIC(dec_Eb, "dec Eb");
    12347             return FNIEMOP_CALL_2(iemOpCommonUnaryEb, bRm, &g_iemAImpl_dec);
     12400        case 0: return FNIEMOP_CALL_1(iemOp_Grp4_inc_Eb, bRm);
     12401        case 1: return FNIEMOP_CALL_1(iemOp_Grp4_dec_Eb, bRm);
    1234812402        default:
     12403            /** @todo is the eff-addr decoded? */
    1234912404            IEMOP_MNEMONIC(grp4_ud, "grp4-ud");
    1235012405            return IEMOP_RAISE_INVALID_OPCODE();
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