Changeset 103213 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Feb 5, 2024 10:53:27 PM (13 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstOneByte.cpp.h
r103212 r103213 13832 13832 13833 13833 13834 /** Opcode 0xf6 /4, /5, /6 and /7. */ 13835 FNIEMOP_DEF_2(iemOpCommonGrp3MulDivEb, uint8_t, bRm, PFNIEMAIMPLMULDIVU8, pfnU8) 13836 { 13837 if (IEM_IS_MODRM_REG_MODE(bRm)) 13838 { 13839 /* register access */ 13840 IEM_MC_BEGIN(3, 1, 0, 0); 13841 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 13842 IEM_MC_ARG(uint16_t *, pu16AX, 0); 13843 IEM_MC_ARG(uint8_t, u8Value, 1); 13844 IEM_MC_ARG(uint32_t *, pEFlags, 2); 13845 IEM_MC_LOCAL(int32_t, rc); 13846 13847 IEM_MC_FETCH_GREG_U8(u8Value, IEM_GET_MODRM_RM(pVCpu, bRm)); 13848 IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); 13849 IEM_MC_REF_EFLAGS(pEFlags); 13850 IEM_MC_CALL_AIMPL_3(rc, pfnU8, pu16AX, u8Value, pEFlags); 13851 IEM_MC_IF_LOCAL_IS_Z(rc) { 13852 IEM_MC_ADVANCE_RIP_AND_FINISH(); 13853 } IEM_MC_ELSE() { 13854 IEM_MC_RAISE_DIVIDE_ERROR(); 13855 } IEM_MC_ENDIF(); 13856 13857 IEM_MC_END(); 13858 } 13859 else 13860 { 13861 /* memory access. */ 13862 IEM_MC_BEGIN(3, 2, 0, 0); 13863 IEM_MC_ARG(uint16_t *, pu16AX, 0); 13864 IEM_MC_ARG(uint8_t, u8Value, 1); 13865 IEM_MC_ARG(uint32_t *, pEFlags, 2); 13866 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 13867 IEM_MC_LOCAL(int32_t, rc); 13868 13869 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); 13870 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 13871 IEM_MC_FETCH_MEM_U8(u8Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 13872 IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); 13873 IEM_MC_REF_EFLAGS(pEFlags); 13874 IEM_MC_CALL_AIMPL_3(rc, pfnU8, pu16AX, u8Value, pEFlags); 13875 IEM_MC_IF_LOCAL_IS_Z(rc) { 13876 IEM_MC_ADVANCE_RIP_AND_FINISH(); 13877 } IEM_MC_ELSE() { 13878 IEM_MC_RAISE_DIVIDE_ERROR(); 13879 } IEM_MC_ENDIF(); 13880 13881 IEM_MC_END(); 13882 } 13883 } 13884 13885 13886 /** Opcode 0xf7 /4, /5, /6 and /7. */ 13887 FNIEMOP_DEF_2(iemOpCommonGrp3MulDivEv, uint8_t, bRm, PCIEMOPMULDIVSIZES, pImpl) 13888 { 13889 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF); 13890 13891 if (IEM_IS_MODRM_REG_MODE(bRm)) 13892 { 13893 /* register access */ 13894 switch (pVCpu->iem.s.enmEffOpSize) 13895 { 13896 case IEMMODE_16BIT: 13897 IEM_MC_BEGIN(4, 1, 0, 0); 13898 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 13899 IEM_MC_ARG(uint16_t *, pu16AX, 0); 13900 IEM_MC_ARG(uint16_t *, pu16DX, 1); 13901 IEM_MC_ARG(uint16_t, u16Value, 2); 13902 IEM_MC_ARG(uint32_t *, pEFlags, 3); 13903 IEM_MC_LOCAL(int32_t, rc); 13904 13905 IEM_MC_FETCH_GREG_U16(u16Value, IEM_GET_MODRM_RM(pVCpu, bRm)); 13906 IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); 13907 IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX); 13908 IEM_MC_REF_EFLAGS(pEFlags); 13909 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); 13910 IEM_MC_IF_LOCAL_IS_Z(rc) { 13911 IEM_MC_ADVANCE_RIP_AND_FINISH(); 13912 } IEM_MC_ELSE() { 13913 IEM_MC_RAISE_DIVIDE_ERROR(); 13914 } IEM_MC_ENDIF(); 13915 13916 IEM_MC_END(); 13917 break; 13918 13919 case IEMMODE_32BIT: 13920 IEM_MC_BEGIN(4, 1, IEM_MC_F_MIN_386, 0); 13921 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 13922 IEM_MC_ARG(uint32_t *, pu32AX, 0); 13923 IEM_MC_ARG(uint32_t *, pu32DX, 1); 13924 IEM_MC_ARG(uint32_t, u32Value, 2); 13925 IEM_MC_ARG(uint32_t *, pEFlags, 3); 13926 IEM_MC_LOCAL(int32_t, rc); 13927 13928 IEM_MC_FETCH_GREG_U32(u32Value, IEM_GET_MODRM_RM(pVCpu, bRm)); 13929 IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX); 13930 IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX); 13931 IEM_MC_REF_EFLAGS(pEFlags); 13932 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); 13933 IEM_MC_IF_LOCAL_IS_Z(rc) { 13934 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); 13935 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xDX); 13936 IEM_MC_ADVANCE_RIP_AND_FINISH(); 13937 } IEM_MC_ELSE() { 13938 IEM_MC_RAISE_DIVIDE_ERROR(); 13939 } IEM_MC_ENDIF(); 13940 13941 IEM_MC_END(); 13942 break; 13943 13944 case IEMMODE_64BIT: 13945 IEM_MC_BEGIN(4, 1, IEM_MC_F_64BIT, 0); 13946 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 13947 IEM_MC_ARG(uint64_t *, pu64AX, 0); 13948 IEM_MC_ARG(uint64_t *, pu64DX, 1); 13949 IEM_MC_ARG(uint64_t, u64Value, 2); 13950 IEM_MC_ARG(uint32_t *, pEFlags, 3); 13951 IEM_MC_LOCAL(int32_t, rc); 13952 13953 IEM_MC_FETCH_GREG_U64(u64Value, IEM_GET_MODRM_RM(pVCpu, bRm)); 13954 IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX); 13955 IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX); 13956 IEM_MC_REF_EFLAGS(pEFlags); 13957 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); 13958 IEM_MC_IF_LOCAL_IS_Z(rc) { 13959 IEM_MC_ADVANCE_RIP_AND_FINISH(); 13960 } IEM_MC_ELSE() { 13961 IEM_MC_RAISE_DIVIDE_ERROR(); 13962 } IEM_MC_ENDIF(); 13963 13964 IEM_MC_END(); 13965 break; 13966 13967 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 13968 } 13969 } 13970 else 13971 { 13972 /* memory access. */ 13973 switch (pVCpu->iem.s.enmEffOpSize) 13974 { 13975 case IEMMODE_16BIT: 13976 IEM_MC_BEGIN(4, 2, 0, 0); 13977 IEM_MC_ARG(uint16_t *, pu16AX, 0); 13978 IEM_MC_ARG(uint16_t *, pu16DX, 1); 13979 IEM_MC_ARG(uint16_t, u16Value, 2); 13980 IEM_MC_ARG(uint32_t *, pEFlags, 3); 13981 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 13982 IEM_MC_LOCAL(int32_t, rc); 13983 13984 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); 13985 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 13986 IEM_MC_FETCH_MEM_U16(u16Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 13987 IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); 13988 IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX); 13989 IEM_MC_REF_EFLAGS(pEFlags); 13990 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); 13991 IEM_MC_IF_LOCAL_IS_Z(rc) { 13992 IEM_MC_ADVANCE_RIP_AND_FINISH(); 13993 } IEM_MC_ELSE() { 13994 IEM_MC_RAISE_DIVIDE_ERROR(); 13995 } IEM_MC_ENDIF(); 13996 13997 IEM_MC_END(); 13998 break; 13999 14000 case IEMMODE_32BIT: 14001 IEM_MC_BEGIN(4, 2, IEM_MC_F_MIN_386, 0); 14002 IEM_MC_ARG(uint32_t *, pu32AX, 0); 14003 IEM_MC_ARG(uint32_t *, pu32DX, 1); 14004 IEM_MC_ARG(uint32_t, u32Value, 2); 14005 IEM_MC_ARG(uint32_t *, pEFlags, 3); 14006 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 14007 IEM_MC_LOCAL(int32_t, rc); 14008 14009 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); 14010 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 14011 IEM_MC_FETCH_MEM_U32(u32Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 14012 IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX); 14013 IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX); 14014 IEM_MC_REF_EFLAGS(pEFlags); 14015 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); 14016 IEM_MC_IF_LOCAL_IS_Z(rc) { 14017 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); 14018 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xDX); 14019 IEM_MC_ADVANCE_RIP_AND_FINISH(); 14020 } IEM_MC_ELSE() { 14021 IEM_MC_RAISE_DIVIDE_ERROR(); 14022 } IEM_MC_ENDIF(); 14023 14024 IEM_MC_END(); 14025 break; 14026 14027 case IEMMODE_64BIT: 14028 IEM_MC_BEGIN(4, 2, IEM_MC_F_64BIT, 0); 14029 IEM_MC_ARG(uint64_t *, pu64AX, 0); 14030 IEM_MC_ARG(uint64_t *, pu64DX, 1); 14031 IEM_MC_ARG(uint64_t, u64Value, 2); 14032 IEM_MC_ARG(uint32_t *, pEFlags, 3); 14033 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); 14034 IEM_MC_LOCAL(int32_t, rc); 14035 14036 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); 14037 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); 14038 IEM_MC_FETCH_MEM_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); 14039 IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX); 14040 IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX); 14041 IEM_MC_REF_EFLAGS(pEFlags); 14042 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); 14043 IEM_MC_IF_LOCAL_IS_Z(rc) { 14044 IEM_MC_ADVANCE_RIP_AND_FINISH(); 14045 } IEM_MC_ELSE() { 14046 IEM_MC_RAISE_DIVIDE_ERROR(); 14047 } IEM_MC_ENDIF(); 14048 14049 IEM_MC_END(); 14050 break; 14051 14052 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 14053 } 14054 } 14055 } 13834 /* Body for opcode 0xf6 variations /4, /5, /6 and /7. */ 13835 #define IEMOP_GRP3_MUL_DIV_EB(bRm, a_pfnU8Expr) \ 13836 PFNIEMAIMPLMULDIVU8 const pfnU8 = (a_pfnU8Expr); \ 13837 if (IEM_IS_MODRM_REG_MODE(bRm)) \ 13838 { \ 13839 /* register access */ \ 13840 IEM_MC_BEGIN(3, 1, 0, 0); \ 13841 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 13842 IEM_MC_ARG(uint16_t *, pu16AX, 0); \ 13843 IEM_MC_ARG(uint8_t, u8Value, 1); \ 13844 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 13845 IEM_MC_LOCAL(int32_t, rc); \ 13846 \ 13847 IEM_MC_FETCH_GREG_U8(u8Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 13848 IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \ 13849 IEM_MC_REF_EFLAGS(pEFlags); \ 13850 IEM_MC_CALL_AIMPL_3(rc, pfnU8, pu16AX, u8Value, pEFlags); \ 13851 IEM_MC_IF_LOCAL_IS_Z(rc) { \ 13852 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 13853 } IEM_MC_ELSE() { \ 13854 IEM_MC_RAISE_DIVIDE_ERROR(); \ 13855 } IEM_MC_ENDIF(); \ 13856 \ 13857 IEM_MC_END(); \ 13858 } \ 13859 else \ 13860 { \ 13861 /* memory access. */ \ 13862 IEM_MC_BEGIN(3, 2, 0, 0); \ 13863 IEM_MC_ARG(uint16_t *, pu16AX, 0); \ 13864 IEM_MC_ARG(uint8_t, u8Value, 1); \ 13865 IEM_MC_ARG(uint32_t *, pEFlags, 2); \ 13866 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 13867 IEM_MC_LOCAL(int32_t, rc); \ 13868 \ 13869 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \ 13870 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 13871 IEM_MC_FETCH_MEM_U8(u8Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \ 13872 IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \ 13873 IEM_MC_REF_EFLAGS(pEFlags); \ 13874 IEM_MC_CALL_AIMPL_3(rc, pfnU8, pu16AX, u8Value, pEFlags); \ 13875 IEM_MC_IF_LOCAL_IS_Z(rc) { \ 13876 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 13877 } IEM_MC_ELSE() { \ 13878 IEM_MC_RAISE_DIVIDE_ERROR(); \ 13879 } IEM_MC_ENDIF(); \ 13880 \ 13881 IEM_MC_END(); \ 13882 } (void)0 13883 13884 13885 /* Body for opcode 0xf7 variant /4, /5, /6 and /7. */ 13886 #define IEMOP_BODY_GRP3_MUL_DIV_EV(bRm, a_pImplExpr) \ 13887 PCIEMOPMULDIVSIZES const pImpl = (a_pImplExpr); \ 13888 if (IEM_IS_MODRM_REG_MODE(bRm)) \ 13889 { \ 13890 /* register access */ \ 13891 switch (pVCpu->iem.s.enmEffOpSize) \ 13892 { \ 13893 case IEMMODE_16BIT: \ 13894 IEM_MC_BEGIN(4, 1, 0, 0); \ 13895 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 13896 IEM_MC_ARG(uint16_t *, pu16AX, 0); \ 13897 IEM_MC_ARG(uint16_t *, pu16DX, 1); \ 13898 IEM_MC_ARG(uint16_t, u16Value, 2); \ 13899 IEM_MC_ARG(uint32_t *, pEFlags, 3); \ 13900 IEM_MC_LOCAL(int32_t, rc); \ 13901 \ 13902 IEM_MC_FETCH_GREG_U16(u16Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 13903 IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \ 13904 IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX); \ 13905 IEM_MC_REF_EFLAGS(pEFlags); \ 13906 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); \ 13907 IEM_MC_IF_LOCAL_IS_Z(rc) { \ 13908 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 13909 } IEM_MC_ELSE() { \ 13910 IEM_MC_RAISE_DIVIDE_ERROR(); \ 13911 } IEM_MC_ENDIF(); \ 13912 \ 13913 IEM_MC_END(); \ 13914 break; \ 13915 \ 13916 case IEMMODE_32BIT: \ 13917 IEM_MC_BEGIN(4, 1, IEM_MC_F_MIN_386, 0); \ 13918 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 13919 IEM_MC_ARG(uint32_t *, pu32AX, 0); \ 13920 IEM_MC_ARG(uint32_t *, pu32DX, 1); \ 13921 IEM_MC_ARG(uint32_t, u32Value, 2); \ 13922 IEM_MC_ARG(uint32_t *, pEFlags, 3); \ 13923 IEM_MC_LOCAL(int32_t, rc); \ 13924 \ 13925 IEM_MC_FETCH_GREG_U32(u32Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 13926 IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX); \ 13927 IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX); \ 13928 IEM_MC_REF_EFLAGS(pEFlags); \ 13929 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); \ 13930 IEM_MC_IF_LOCAL_IS_Z(rc) { \ 13931 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); \ 13932 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xDX); \ 13933 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 13934 } IEM_MC_ELSE() { \ 13935 IEM_MC_RAISE_DIVIDE_ERROR(); \ 13936 } IEM_MC_ENDIF(); \ 13937 \ 13938 IEM_MC_END(); \ 13939 break; \ 13940 \ 13941 case IEMMODE_64BIT: \ 13942 IEM_MC_BEGIN(4, 1, IEM_MC_F_64BIT, 0); \ 13943 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 13944 IEM_MC_ARG(uint64_t *, pu64AX, 0); \ 13945 IEM_MC_ARG(uint64_t *, pu64DX, 1); \ 13946 IEM_MC_ARG(uint64_t, u64Value, 2); \ 13947 IEM_MC_ARG(uint32_t *, pEFlags, 3); \ 13948 IEM_MC_LOCAL(int32_t, rc); \ 13949 \ 13950 IEM_MC_FETCH_GREG_U64(u64Value, IEM_GET_MODRM_RM(pVCpu, bRm)); \ 13951 IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX); \ 13952 IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX); \ 13953 IEM_MC_REF_EFLAGS(pEFlags); \ 13954 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); \ 13955 IEM_MC_IF_LOCAL_IS_Z(rc) { \ 13956 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 13957 } IEM_MC_ELSE() { \ 13958 IEM_MC_RAISE_DIVIDE_ERROR(); \ 13959 } IEM_MC_ENDIF(); \ 13960 \ 13961 IEM_MC_END(); \ 13962 break; \ 13963 \ 13964 IEM_NOT_REACHED_DEFAULT_CASE_RET(); \ 13965 } \ 13966 } \ 13967 else \ 13968 { \ 13969 /* memory access. */ \ 13970 switch (pVCpu->iem.s.enmEffOpSize) \ 13971 { \ 13972 case IEMMODE_16BIT: \ 13973 IEM_MC_BEGIN(4, 2, 0, 0); \ 13974 IEM_MC_ARG(uint16_t *, pu16AX, 0); \ 13975 IEM_MC_ARG(uint16_t *, pu16DX, 1); \ 13976 IEM_MC_ARG(uint16_t, u16Value, 2); \ 13977 IEM_MC_ARG(uint32_t *, pEFlags, 3); \ 13978 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 13979 IEM_MC_LOCAL(int32_t, rc); \ 13980 \ 13981 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \ 13982 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 13983 IEM_MC_FETCH_MEM_U16(u16Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \ 13984 IEM_MC_REF_GREG_U16(pu16AX, X86_GREG_xAX); \ 13985 IEM_MC_REF_GREG_U16(pu16DX, X86_GREG_xDX); \ 13986 IEM_MC_REF_EFLAGS(pEFlags); \ 13987 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU16, pu16AX, pu16DX, u16Value, pEFlags); \ 13988 IEM_MC_IF_LOCAL_IS_Z(rc) { \ 13989 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 13990 } IEM_MC_ELSE() { \ 13991 IEM_MC_RAISE_DIVIDE_ERROR(); \ 13992 } IEM_MC_ENDIF(); \ 13993 \ 13994 IEM_MC_END(); \ 13995 break; \ 13996 \ 13997 case IEMMODE_32BIT: \ 13998 IEM_MC_BEGIN(4, 2, IEM_MC_F_MIN_386, 0); \ 13999 IEM_MC_ARG(uint32_t *, pu32AX, 0); \ 14000 IEM_MC_ARG(uint32_t *, pu32DX, 1); \ 14001 IEM_MC_ARG(uint32_t, u32Value, 2); \ 14002 IEM_MC_ARG(uint32_t *, pEFlags, 3); \ 14003 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 14004 IEM_MC_LOCAL(int32_t, rc); \ 14005 \ 14006 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \ 14007 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 14008 IEM_MC_FETCH_MEM_U32(u32Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \ 14009 IEM_MC_REF_GREG_U32(pu32AX, X86_GREG_xAX); \ 14010 IEM_MC_REF_GREG_U32(pu32DX, X86_GREG_xDX); \ 14011 IEM_MC_REF_EFLAGS(pEFlags); \ 14012 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU32, pu32AX, pu32DX, u32Value, pEFlags); \ 14013 IEM_MC_IF_LOCAL_IS_Z(rc) { \ 14014 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xAX); \ 14015 IEM_MC_CLEAR_HIGH_GREG_U64(X86_GREG_xDX); \ 14016 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 14017 } IEM_MC_ELSE() { \ 14018 IEM_MC_RAISE_DIVIDE_ERROR(); \ 14019 } IEM_MC_ENDIF(); \ 14020 \ 14021 IEM_MC_END(); \ 14022 break; \ 14023 \ 14024 case IEMMODE_64BIT: \ 14025 IEM_MC_BEGIN(4, 2, IEM_MC_F_64BIT, 0); \ 14026 IEM_MC_ARG(uint64_t *, pu64AX, 0); \ 14027 IEM_MC_ARG(uint64_t *, pu64DX, 1); \ 14028 IEM_MC_ARG(uint64_t, u64Value, 2); \ 14029 IEM_MC_ARG(uint32_t *, pEFlags, 3); \ 14030 IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst); \ 14031 IEM_MC_LOCAL(int32_t, rc); \ 14032 \ 14033 IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0); \ 14034 IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX(); \ 14035 IEM_MC_FETCH_MEM_U64(u64Value, pVCpu->iem.s.iEffSeg, GCPtrEffDst); \ 14036 IEM_MC_REF_GREG_U64(pu64AX, X86_GREG_xAX); \ 14037 IEM_MC_REF_GREG_U64(pu64DX, X86_GREG_xDX); \ 14038 IEM_MC_REF_EFLAGS(pEFlags); \ 14039 IEM_MC_CALL_AIMPL_4(rc, pImpl->pfnU64, pu64AX, pu64DX, u64Value, pEFlags); \ 14040 IEM_MC_IF_LOCAL_IS_Z(rc) { \ 14041 IEM_MC_ADVANCE_RIP_AND_FINISH(); \ 14042 } IEM_MC_ELSE() { \ 14043 IEM_MC_RAISE_DIVIDE_ERROR(); \ 14044 } IEM_MC_ENDIF(); \ 14045 \ 14046 IEM_MC_END(); \ 14047 break; \ 14048 \ 14049 IEM_NOT_REACHED_DEFAULT_CASE_RET(); \ 14050 } \ 14051 } (void)0 14056 14052 14057 14053 … … 14102 14098 IEMOP_MNEMONIC(mul_Eb, "mul Eb"); 14103 14099 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF); 14104 return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEb, bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_mul_u8_eflags)); 14100 IEMOP_GRP3_MUL_DIV_EB(bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_mul_u8_eflags)); 14101 break; 14105 14102 case 5: 14106 14103 /** … … 14112 14109 IEMOP_MNEMONIC(imul_Eb, "imul Eb"); 14113 14110 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF); 14114 return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEb, bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_u8_eflags)); 14111 IEMOP_GRP3_MUL_DIV_EB(bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_u8_eflags)); 14112 break; 14115 14113 case 6: 14116 14114 /** … … 14122 14120 IEMOP_MNEMONIC(div_Eb, "div Eb"); 14123 14121 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_OF | X86_EFL_CF); 14124 return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEb, bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_div_u8_eflags)); 14122 IEMOP_GRP3_MUL_DIV_EB(bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_div_u8_eflags)); 14123 break; 14125 14124 case 7: 14126 14125 /** … … 14132 14131 IEMOP_MNEMONIC(idiv_Eb, "idiv Eb"); 14133 14132 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_OF | X86_EFL_CF); 14134 return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEb, bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_idiv_u8_eflags)); 14133 IEMOP_GRP3_MUL_DIV_EB(bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_idiv_u8_eflags)); 14134 break; 14135 14135 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 14136 14136 } … … 14327 14327 IEMOP_MNEMONIC(mul_Ev, "mul Ev"); 14328 14328 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF); 14329 return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEv, bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_mul_eflags)); 14329 IEMOP_BODY_GRP3_MUL_DIV_EV(bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_mul_eflags)); 14330 break; 14330 14331 case 5: 14331 14332 /** … … 14337 14338 IEMOP_MNEMONIC(imul_Ev, "imul Ev"); 14338 14339 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF); 14339 return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEv, bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_eflags)); 14340 IEMOP_BODY_GRP3_MUL_DIV_EV(bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_eflags)); 14341 break; 14340 14342 case 6: 14341 14343 /** … … 14347 14349 IEMOP_MNEMONIC(div_Ev, "div Ev"); 14348 14350 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_OF | X86_EFL_CF); 14349 return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEv, bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_div_eflags)); 14351 IEMOP_BODY_GRP3_MUL_DIV_EV(bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_div_eflags)); 14352 break; 14350 14353 case 7: 14351 14354 /** … … 14357 14360 IEMOP_MNEMONIC(idiv_Ev, "idiv Ev"); 14358 14361 IEMOP_VERIFICATION_UNDEFINED_EFLAGS(X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_OF | X86_EFL_CF); 14359 return FNIEMOP_CALL_2(iemOpCommonGrp3MulDivEv, bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_idiv_eflags)); 14362 IEMOP_BODY_GRP3_MUL_DIV_EV(bRm, IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_idiv_eflags)); 14363 break; 14360 14364 IEM_NOT_REACHED_DEFAULT_CASE_RET(); 14361 14365 }
Note:
See TracChangeset
for help on using the changeset viewer.