VirtualBox

Changeset 99298 in vbox


Ignore:
Timestamp:
Apr 5, 2023 10:27:15 PM (22 months ago)
Author:
vboxsync
Message:

VMM/IEM: More work on processing MC blocks and generating threaded functions from them. bugref:10369

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

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

    r99287 r99298  
    27132713        case IEMMODE_16BIT:
    27142714        {
     2715            PFNIEMAIMPLBINU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags);
    27152716            if (IEM_IS_MODRM_REG_MODE(bRm))
    27162717            {
     
    27282729                IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
    27292730                IEM_MC_REF_EFLAGS(pEFlags);
    2730                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags),
    2731                                          pu16Dst, u16Src, pEFlags);
     2731                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU16, pu16Dst, u16Src, pEFlags);
    27322732                IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Tmp);
    27332733
     
    27522752                IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
    27532753                IEM_MC_REF_EFLAGS(pEFlags);
    2754                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags),
    2755                                          pu16Dst, u16Src, pEFlags);
     2754                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU16, pu16Dst, u16Src, pEFlags);
    27562755                IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Tmp);
    27572756
     
    27642763        case IEMMODE_32BIT:
    27652764        {
     2765            PFNIEMAIMPLBINU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags);
    27662766            if (IEM_IS_MODRM_REG_MODE(bRm))
    27672767            {
     
    27792779                IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
    27802780                IEM_MC_REF_EFLAGS(pEFlags);
    2781                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags),
    2782                                          pu32Dst, u32Src, pEFlags);
     2781                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU32, pu32Dst, u32Src, pEFlags);
    27832782                IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Tmp);
    27842783
     
    28032802                IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
    28042803                IEM_MC_REF_EFLAGS(pEFlags);
    2805                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags),
    2806                                          pu32Dst, u32Src, pEFlags);
     2804                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU32, pu32Dst, u32Src, pEFlags);
    28072805                IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Tmp);
    28082806
     
    28152813        case IEMMODE_64BIT:
    28162814        {
     2815            PFNIEMAIMPLBINU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags);
    28172816            if (IEM_IS_MODRM_REG_MODE(bRm))
    28182817            {
     
    28302829                IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
    28312830                IEM_MC_REF_EFLAGS(pEFlags);
    2832                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags),
    2833                                          pu64Dst, u64Src, pEFlags);
     2831                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU64, pu64Dst, u64Src, pEFlags);
    28342832                IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Tmp);
    28352833
     
    28542852                IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
    28552853                IEM_MC_REF_EFLAGS(pEFlags);
    2856                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags),
    2857                                          pu64Dst, u64Src, pEFlags);
     2854                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU64, pu64Dst, u64Src, pEFlags);
    28582855                IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Tmp);
    28592856
     
    29182915    {
    29192916        case IEMMODE_16BIT:
     2917        {
     2918            PFNIEMAIMPLBINU16 const pfnAImplU16 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags);
    29202919            if (IEM_IS_MODRM_REG_MODE(bRm))
    29212920            {
     
    29332932                IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
    29342933                IEM_MC_REF_EFLAGS(pEFlags);
    2935                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags),
    2936                                          pu16Dst, u16Src, pEFlags);
     2934                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU16, pu16Dst, u16Src, pEFlags);
    29372935                IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Tmp);
    29382936
     
    29572955                IEM_MC_REF_LOCAL(pu16Dst, u16Tmp);
    29582956                IEM_MC_REF_EFLAGS(pEFlags);
    2959                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u16_eflags),
    2960                                          pu16Dst, u16Src, pEFlags);
     2957                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU16, pu16Dst, u16Src, pEFlags);
    29612958                IEM_MC_STORE_GREG_U16(IEM_GET_MODRM_REG(pVCpu, bRm), u16Tmp);
    29622959
     
    29652962            }
    29662963            break;
     2964        }
    29672965
    29682966        case IEMMODE_32BIT:
     2967        {
     2968            PFNIEMAIMPLBINU32 const pfnAImplU32 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags);
    29692969            if (IEM_IS_MODRM_REG_MODE(bRm))
    29702970            {
     
    29822982                IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
    29832983                IEM_MC_REF_EFLAGS(pEFlags);
    2984                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags),
    2985                                          pu32Dst, u32Src, pEFlags);
     2984                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU32, pu32Dst, u32Src, pEFlags);
    29862985                IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Tmp);
    29872986
     
    30063005                IEM_MC_REF_LOCAL(pu32Dst, u32Tmp);
    30073006                IEM_MC_REF_EFLAGS(pEFlags);
    3008                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u32_eflags),
    3009                                          pu32Dst, u32Src, pEFlags);
     3007                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU32, pu32Dst, u32Src, pEFlags);
    30103008                IEM_MC_STORE_GREG_U32(IEM_GET_MODRM_REG(pVCpu, bRm), u32Tmp);
    30113009
     
    30143012            }
    30153013            break;
     3014        }
    30163015
    30173016        case IEMMODE_64BIT:
     3017        {
     3018            PFNIEMAIMPLBINU64 const pfnAImplU64 = IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags);
    30183019            if (IEM_IS_MODRM_REG_MODE(bRm))
    30193020            {
     
    30313032                IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
    30323033                IEM_MC_REF_EFLAGS(pEFlags);
    3033                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags),
    3034                                          pu64Dst, u64Src, pEFlags);
     3034                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU64, pu64Dst, u64Src, pEFlags);
    30353035                IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Tmp);
    30363036
     
    30553055                IEM_MC_REF_LOCAL(pu64Dst, u64Tmp);
    30563056                IEM_MC_REF_EFLAGS(pEFlags);
    3057                 IEM_MC_CALL_VOID_AIMPL_3(IEMTARGETCPU_EFL_BEHAVIOR_SELECT(g_iemAImpl_imul_two_u64_eflags),
    3058                                          pu64Dst, u64Src, pEFlags);
     3057                IEM_MC_CALL_VOID_AIMPL_3(pfnAImplU64, pu64Dst, u64Src, pEFlags);
    30593058                IEM_MC_STORE_GREG_U64(IEM_GET_MODRM_REG(pVCpu, bRm), u64Tmp);
    30603059
     
    30633062            }
    30643063            break;
     3064        }
    30653065
    30663066        IEM_NOT_REACHED_DEFAULT_CASE_RET();
     
    58865886        } IEM_MC_ENDIF(); \
    58875887        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    5888         IEM_MC_END();
     5888        IEM_MC_END() \
    58895889
    58905890/**
     
    60356035        } IEM_MC_ENDIF(); \
    60366036        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    6037         IEM_MC_END();
     6037        IEM_MC_END() \
    60386038
    60396039/**
     
    62416241        } IEM_MC_ENDIF(); \
    62426242        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    6243         IEM_MC_END();
     6243        IEM_MC_END() \
    62446244
    62456245/**
     
    63796379        } IEM_MC_ENDIF(); \
    63806380        IEM_MC_ADVANCE_RIP_AND_FINISH(); \
    6381         IEM_MC_END();
     6381        IEM_MC_END() \
    63826382
    63836383/**
     
    1249212492    }
    1249312493}
    12494 
    12495 typedef IEM_CIMPL_DECL_TYPE_3(FNIEMCIMPLFARBRANCH, uint16_t, uSel, uint64_t, offSeg, IEMMODE, enmOpSize);
    12496 typedef FNIEMCIMPLFARBRANCH *PFNIEMCIMPLFARBRANCH;
    1249712494
    1249812495FNIEMOP_DEF_2(iemOpHlp_Grp5_far_Ep, uint8_t, bRm, PFNIEMCIMPLFARBRANCH, pfnCImpl)
  • trunk/src/VBox/VMM/VMMAll/IEMAllThreadedPython.py

    r99296 r99298  
    270270            offBits   = sMember.rfind('U') + 1;
    271271            if sBaseType == 'PCIEMOPBINSIZES':          return 'PFNIEMAIMPLBINU'        + sMember[offBits:];
    272             if sBaseType == 'PCIEMOPUNARYSIZES':        return 'PFNIEMAIMPLBINU'        + sMember[offBits:];
     272            if sBaseType == 'PCIEMOPUNARYSIZES':        return 'PFNIEMAIMPLUNARYU'      + sMember[offBits:];
    273273            if sBaseType == 'PCIEMOPSHIFTSIZES':        return 'PFNIEMAIMPLSHIFTU'      + sMember[offBits:];
    274274            if sBaseType == 'PCIEMOPSHIFTDBLSIZES':     return 'PFNIEMAIMPLSHIFTDBLU'   + sMember[offBits:];
     
    291291        """
    292292        idxReg = 0;
    293         if (   oStmt.sName.find('_STORE_') > 0
     293        if (   oStmt.sName.find('_FETCH_') > 0
    294294            or oStmt.sName.find('_REF_') > 0
    295295            or oStmt.sName.find('_TO_LOCAL') > 0):
  • trunk/src/VBox/VMM/VMMAll/IEMThreadedFunctions.cpp

    r99291 r99298  
    133133    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1, a2, a3)
    134134
     135/** Variant of IEM_MC_CALL_CIMPL_5 with explicit instruction length parameter. */
     136# define IEM_MC_CALL_CIMPL_5_THREADED(a_cbInstr, a_pfnCImpl, a0, a1, a2, a3, a4) \
     137    return (a_pfnCImpl)(pVCpu, (a_cbInstr), a0, a1, a2, a3, a4)
     138
     139/** Variant of IEM_MC_FETCH_GREG_U8 with extended (20) register index. */
     140#define IEM_MC_FETCH_GREG_U8_THREADED(a_u8Dst, a_iGRegEx) \
     141    (a_u8Dst) = iemGRegFetchU8Ex(pVCpu, (a_iGRegEx))
     142
     143/** Variant of IEM_MC_FETCH_GREG_U8_ZX_U16 with extended (20) register index. */
     144#define IEM_MC_FETCH_GREG_U8_ZX_U16_THREADED(a_u16Dst, a_iGRegEx) \
     145    (a_u16Dst) = iemGRegFetchU8Ex(pVCpu, (a_iGRegEx))
     146
     147/** Variant of IEM_MC_FETCH_GREG_U8_ZX_U32 with extended (20) register index. */
     148#define IEM_MC_FETCH_GREG_U8_ZX_U32_THREADED(a_u32Dst, a_iGRegEx) \
     149    (a_u32Dst) = iemGRegFetchU8Ex(pVCpu, (a_iGRegEx))
     150
     151/** Variant of IEM_MC_FETCH_GREG_U8_ZX_U64 with extended (20) register index. */
     152#define IEM_MC_FETCH_GREG_U8_ZX_U64_THREADED(a_u64Dst, a_iGRegEx) \
     153    (a_u64Dst) = iemGRegFetchU8Ex(pVCpu, (a_iGRegEx))
     154
     155/** Variant of IEM_MC_FETCH_GREG_U8_SX_U16 with extended (20) register index. */
     156#define IEM_MC_FETCH_GREG_U8_SX_U16_THREADED(a_u16Dst, a_iGRegEx) \
     157    (a_u16Dst) = (int8_t)iemGRegFetchU8Ex(pVCpu, (a_iGRegEx))
     158
     159/** Variant of IEM_MC_FETCH_GREG_U8_SX_U32 with extended (20) register index. */
     160#define IEM_MC_FETCH_GREG_U8_SX_U32_THREADED(a_u32Dst, a_iGRegEx) \
     161    (a_u32Dst) = (int8_t)iemGRegFetchU8Ex(pVCpu, (a_iGRegEx))
     162
     163/** Variant of IEM_MC_FETCH_GREG_U8_SX_U64 with extended (20) register index. */
     164#define IEM_MC_FETCH_GREG_U8_SX_U64_THREADED(a_u64Dst, a_iGRegEx) \
     165    (a_u64Dst) = (int8_t)iemGRegFetchU8Ex(pVCpu, (a_iGRegEx))
     166
     167/** Variant of IEM_MC_STORE_GREG_U8 with extended (20) register index. */
     168#define IEM_MC_STORE_GREG_U8_THREADED(a_iGRegEx, a_u8Value) \
     169    *iemGRegRefU8Ex(pVCpu, (a_iGRegEx)) = (a_u8Value)
     170
     171/** Variant of IEM_MC_STORE_GREG_U8 with extended (20) register index. */
     172#define IEM_MC_STORE_GREG_U8_CONST_THREADED(a_iGRegEx, a_u8Value) \
     173    *iemGRegRefU8Ex(pVCpu, (a_iGRegEx)) = (a_u8Value)
     174
     175/** Variant of IEM_MC_REF_GREG_U8 with extended (20) register index. */
     176#define IEM_MC_REF_GREG_U8_THREADED(a_pu8Dst, a_iGRegEx) \
     177    (a_pu8Dst) = iemGRegRefU8Ex(pVCpu, (a_iGRegEx))
     178
     179/** Variant of IEM_MC_ADD_GREG_U8 with extended (20) register index. */
     180#define IEM_MC_ADD_GREG_U8_THREADED(a_iGRegEx, a_u8Value) \
     181    *iemGRegRefU8Ex(pVCpu, (a_iGRegEx)) += (a_u8Value)
     182
     183/** Variant of IEM_MC_SUB_GREG_U8 with extended (20) register index. */
     184#define IEM_MC_SUB_GREG_U8_THREADED(a_iGRegEx,  a_u8Value) \
     185    *iemGRegRefU8Ex(pVCpu, (a_iGRegEx)) -= (a_u8Value)
     186
     187/** Variant of IEM_MC_ADD_GREG_U8_TO_LOCAL with extended (20) register index. */
     188#define IEM_MC_ADD_GREG_U8_TO_LOCAL_THREADED(a_u8Value, a_iGRegEx) \
     189    do { (a_u8Value)  += iemGRegFetchU8Ex(pVCpu, (a_iGRegEx)); } while (0)
     190
     191/** Variant of IEM_MC_AND_GREG_U8 with extended (20) register index. */
     192#define IEM_MC_AND_GREG_U8_THREADED(a_iGRegEx, a_u8Value) \
     193    *iemGRegRefU8Ex(pVCpu, (a_iGRegEx)) &= (a_u8Value)
     194
     195/** Variant of IEM_MC_OR_GREG_U8 with extended (20) register index. */
     196#define IEM_MC_OR_GREG_U8_THREADED(a_iGRegEx, a_u8Value) \
     197    *iemGRegRefU8Ex(pVCpu, (a_iGRegEx)) |= (a_u8Value)
    135198
    136199/**
  • trunk/src/VBox/VMM/include/IEMInline.h

    r99296 r99298  
    15501550/**
    15511551 * Gets a reference (pointer) to the specified 8-bit general purpose register,
    1552  * alternative version with extended register index.
     1552 * alternative version with extended (20) register index.
    15531553 *
    15541554 * @returns Register reference.
     
    16661666}
    16671667#endif
     1668
     1669
     1670/**
     1671 * Fetches the value of a 8-bit general purpose register, alternative version
     1672 * with extended (20) register index.
     1673
     1674 * @returns The register value.
     1675 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     1676 * @param   iRegEx              The register.  The 16 first are regular ones,
     1677 *                              whereas 16 thru 19 maps to AH, CH, DH and BH.
     1678 */
     1679DECLINLINE(uint8_t) iemGRegFetchU8Ex(PVMCPUCC pVCpu, uint8_t iRegEx) RT_NOEXCEPT
     1680{
     1681    return *iemGRegRefU8Ex(pVCpu, iRegEx);
     1682}
    16681683
    16691684
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r98969 r99298  
    40624062IEM_CIMPL_PROTO_3(iemCImpl_FarJmp, uint16_t, uSel, uint64_t, offSeg, IEMMODE, enmEffOpSize);
    40634063IEM_CIMPL_PROTO_3(iemCImpl_callf, uint16_t, uSel, uint64_t, offSeg, IEMMODE, enmEffOpSize);
     4064typedef IEM_CIMPL_DECL_TYPE_3(FNIEMCIMPLFARBRANCH, uint16_t, uSel, uint64_t, offSeg, IEMMODE, enmEffOpSize);
     4065typedef FNIEMCIMPLFARBRANCH *PFNIEMCIMPLFARBRANCH;
    40644066IEM_CIMPL_PROTO_2(iemCImpl_retf, IEMMODE, enmEffOpSize, uint16_t, cbPop);
    40654067IEM_CIMPL_PROTO_0(iemCImpl_retn_16);
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