VirtualBox

Ignore:
Timestamp:
Mar 7, 2024 9:34:26 AM (12 months ago)
Author:
vboxsync
Message:

VMM/IEM: Created a RO version of IEMOP_BODY_BINARY_r8_rm for CMP. bugref:10376

File:
1 edited

Legend:

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

    r103718 r103719  
    296296            IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \
    297297            IEM_MC_STORE_GREG_U8(IEM_GET_MODRM_REG(pVCpu, a_bRm), u8Dst); \
     298            IEM_MC_COMMIT_EFLAGS(uEFlags); \
     299        } IEM_MC_NATIVE_ELSE() { \
     300            IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     301            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     302            IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
     303            IEM_MC_REF_EFLAGS(pEFlags); \
     304            IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     305        } IEM_MC_NATIVE_ENDIF(); \
     306        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     307        IEM_MC_END(); \
     308    } \
     309    (void)0
     310
     311/**
     312 * Body for byte instruction CMP with a register as the destination.
     313 */
     314#define IEMOP_BODY_BINARY_r8_rm_RO(a_bRm, a_InsNm, a_fNativeArchs) \
     315    /* \
     316     * If rm is denoting a register, no more instruction bytes. \
     317     */ \
     318    if (IEM_IS_MODRM_REG_MODE(a_bRm)) \
     319    { \
     320        IEM_MC_BEGIN(3, 0, 0, 0); \
     321        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     322        IEM_MC_ARG(uint8_t,         u8Src,   1); \
     323        IEM_MC_FETCH_GREG_U8(u8Src, IEM_GET_MODRM_RM(pVCpu, a_bRm)); \
     324        IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     325            IEM_MC_LOCAL(uint8_t,   u8Dst); \
     326            IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     327            /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \
     328            IEM_MC_LOCAL(uint32_t,  uEFlags); \
     329            IEM_MC_FETCH_EFLAGS(uEFlags); \
     330            IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \
     331            IEM_MC_COMMIT_EFLAGS(uEFlags); \
     332        } IEM_MC_NATIVE_ELSE() { \
     333            IEM_MC_ARG(uint8_t *,   pu8Dst,  0); \
     334            IEM_MC_REF_GREG_U8(pu8Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     335            IEM_MC_ARG(uint32_t *,  pEFlags, 2); \
     336            IEM_MC_REF_EFLAGS(pEFlags); \
     337            IEM_MC_CALL_VOID_AIMPL_3(RT_CONCAT3(iemAImpl_,a_InsNm,_u8), pu8Dst, u8Src, pEFlags); \
     338        } IEM_MC_NATIVE_ENDIF(); \
     339        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
     340        IEM_MC_END(); \
     341    } \
     342    else \
     343    { \
     344        /* \
     345         * We're accessing memory. \
     346         */ \
     347        IEM_MC_BEGIN(3, 1, 0, 0); \
     348        IEM_MC_LOCAL(RTGCPTR,  GCPtrEffDst); \
     349        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, a_bRm, 0); \
     350        IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \
     351        IEM_MC_ARG(uint8_t,         u8Src,   1); \
     352        IEM_MC_FETCH_MEM_U8(u8Src, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \
     353        IEM_MC_NATIVE_IF(a_fNativeArchs) { \
     354            IEM_MC_LOCAL(uint8_t,   u8Dst); \
     355            IEM_MC_FETCH_GREG_U8(u8Dst, IEM_GET_MODRM_REG(pVCpu, a_bRm)); \
     356            /** @todo IEM_MC_LOCAL_EFLAGS(uEFlags); */ \
     357            IEM_MC_LOCAL(uint32_t,  uEFlags); \
     358            IEM_MC_FETCH_EFLAGS(uEFlags); \
     359            IEM_MC_NATIVE_EMIT_4(RT_CONCAT3(iemNativeEmit_,a_InsNm,_r_r_efl), u8Dst, u8Src, uEFlags, 8); \
    298360            IEM_MC_COMMIT_EFLAGS(uEFlags); \
    299361        } IEM_MC_NATIVE_ELSE() { \
     
    17921854    IEMOP_MNEMONIC(cmp_Gb_Eb, "cmp Gb,Eb");
    17931855    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
    1794     IEMOP_BODY_BINARY_r8_rm(bRm, cmp, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64);
     1856    IEMOP_BODY_BINARY_r8_rm_RO(bRm, cmp, RT_ARCH_VAL_AMD64 | RT_ARCH_VAL_ARM64);
    17951857}
    17961858
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