VirtualBox

Changeset 105183 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jul 8, 2024 12:26:36 PM (7 months ago)
Author:
vboxsync
Message:

VMM/IEM: A few new IEM MC statements required for AVX/AVX2 floating point instruction emulations, bugref:9898

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py

    r104419 r105183  
    31343134    'IEM_MC_FETCH_YREG_U128':                                    (McBlock.parseMcGeneric,           False, False, g_fNativeSimd),
    31353135    'IEM_MC_FETCH_YREG_U256':                                    (McBlock.parseMcGeneric,           False, False, g_fNativeSimd),
     3136    'IEM_MC_FETCH_YREG_YMM':                                     (McBlock.parseMcGeneric,           False, False, g_fNativeSimd),
    31363137    'IEM_MC_FETCH_YREG_U32':                                     (McBlock.parseMcGeneric,           False, False, g_fNativeSimd),
    31373138    'IEM_MC_FETCH_YREG_U64':                                     (McBlock.parseMcGeneric,           False, False, g_fNativeSimd),
     
    32953296    'IEM_MC_REF_XREG_R64_CONST':                                 (McBlock.parseMcGeneric,           False, False, g_fNativeSimd),
    32963297    'IEM_MC_REF_XREG_U128':                                      (McBlock.parseMcGeneric,           False, False, True,  ),
     3298    'IEM_MC_REF_XREG_XMM':                                       (McBlock.parseMcGeneric,           False, False, True,  ),
    32973299    'IEM_MC_REF_XREG_U128_CONST':                                (McBlock.parseMcGeneric,           False, False, True,  ),
    32983300    'IEM_MC_REF_XREG_U32_CONST':                                 (McBlock.parseMcGeneric,           False, False, g_fNativeSimd),
     
    33843386    'IEM_MC_STORE_YREG_U128_ZX_VLMAX':                           (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
    33853387    'IEM_MC_STORE_YREG_U256_ZX_VLMAX':                           (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
     3388    'IEM_MC_STORE_YREG_YMM_ZX_VLMAX':                            (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
    33863389    'IEM_MC_STORE_YREG_U32_U256':                                (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
    33873390    'IEM_MC_STORE_YREG_U32_ZX_VLMAX':                            (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veLiveness.cpp

    r104420 r105183  
    746746
    747747#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)                   NOP()
     748#define IEM_MC_REF_XREG_XMM(a_puXmmDst, a_iXReg)                    NOP()
    748749#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg)             NOP()
    749750#define IEM_MC_REF_XREG_XMM_CONST(a_pXmmDst, a_iXReg)               NOP()
     
    758759#define IEM_MC_FETCH_YREG_U128(a_u128Dst, a_iYRegSrc, a_iDQWord)    NOP()
    759760#define IEM_MC_FETCH_YREG_U256(a_u256Dst, a_iYRegSrc)               NOP()
     761#define IEM_MC_FETCH_YREG_YMM(a_uYmmDst, a_iYRegSrc)                NOP()
    760762
    761763#define IEM_MC_STORE_YREG_U128(a_iYRegDst, a_iDQword, a_u128Value)  NOP()
     
    766768#define IEM_MC_STORE_YREG_U128_ZX_VLMAX(a_iYRegDst, a_u128Src)      NOP()
    767769#define IEM_MC_STORE_YREG_U256_ZX_VLMAX(a_iYRegDst, a_u256Src)      NOP()
     770#define IEM_MC_STORE_YREG_YMM_ZX_VLMAX(a_iYRegDst, a_uYmmSrc)       NOP()
    768771
    769772#define IEM_MC_STORE_YREG_U32_U256(a_iYRegDst, a_iDwDst, a_u256Value, a_iDwSrc)      NOP()
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8vePython.py

    r104422 r105183  
    204204    'IEM_MC_FETCH_MEM_FLAT_U8_ZX_U64':                                   (None, True,  True,  True,  ),
    205205    'IEM_MC_FETCH_MEM_FLAT_XMM_ALIGN_SSE':                               (None, True,  True,  g_fNativeSimd),
     206    'IEM_MC_FETCH_MEM_FLAT_XMM_NO_AC':                                   (None, True,  True,  g_fNativeSimd),
    206207    'IEM_MC_FETCH_MEM_FLAT_U128_AND_XREG_U128':                          (None, True,  True,  False, ),
    207208    'IEM_MC_FETCH_MEM_FLAT_XMM_ALIGN_SSE_AND_XREG_XMM':                  (None, True,  True,  False, ),
     
    210211    'IEM_MC_FETCH_MEM_FLAT_U128_AND_XREG_U128_AND_RAX_RDX_U64':          (None, True,  True,  False, ),
    211212    'IEM_MC_FETCH_MEM_FLAT_U128_AND_XREG_U128_AND_EAX_EDX_U32_SX_U64':   (None, True,  True,  False, ),
     213    'IEM_MC_FETCH_MEM_FLAT_YMM_NO_AC':                                   (None, True,  True,  g_fNativeSimd),
    212214    'IEM_MC_MEM_FLAT_MAP_D80_WO':                                        (None, True,  True,  True,  ),
    213215    'IEM_MC_MEM_FLAT_MAP_I16_WO':                                        (None, True,  True,  True,  ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h

    r105035 r105183  
    54125412#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg) \
    54135413    off = iemNativeEmitRefXregXxx(pReNative, off, a_pu128Dst, a_iXReg, false /*fConst*/)
     5414
     5415#define IEM_MC_REF_XREG_XMM(a_puXmmDst, a_iXReg) \
     5416    off = iemNativeEmitRefXregXxx(pReNative, off, a_puXmmDst, a_iXReg, false /*fConst*/)
    54145417
    54155418#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg) \
     
    71647167                                               (uintptr_t)iemNativeHlpMemFlatFetchDataU128NoAc, pCallEntry->idxInstr)
    71657168
     7169#define IEM_MC_FETCH_MEM_FLAT_XMM_NO_AC(a_uXmmDst, a_GCPtrMem) \
     7170    off = iemNativeEmitMemFetchStoreDataCommon(pReNative, off, a_uXmmDst, UINT8_MAX, a_GCPtrMem, \
     7171                                               sizeof(X86XMMREG), sizeof(X86XMMREG) - 1, kIemNativeEmitMemOp_Fetch, \
     7172                                               (uintptr_t)iemNativeHlpMemFlatFetchDataU128NoAc, pCallEntry->idxInstr)
     7173
    71667174/* 256-bit segmented: */
    71677175#define IEM_MC_FETCH_MEM_U256(a_u256Dst, a_iSeg, a_GCPtrMem) \
     
    71967204                                               (sizeof(RTUINT256U) - 1U) | IEM_MEMMAP_F_ALIGN_GP, kIemNativeEmitMemOp_Fetch, \
    71977205                                               (uintptr_t)iemNativeHlpMemFlatFetchDataU256AlignedAvx, pCallEntry->idxInstr)
     7206
     7207#define IEM_MC_FETCH_MEM_FLAT_YMM_NO_AC(a_uYmmDst, a_GCPtrMem) \
     7208    off = iemNativeEmitMemFetchStoreDataCommon(pReNative, off, a_uYmmDst, UINT8_MAX, a_GCPtrMem, \
     7209                                               sizeof(X86YMMREG), sizeof(X86YMMREG) - 1, kIemNativeEmitMemOp_Fetch, \
     7210                                               (uintptr_t)iemNativeHlpMemFlatFetchDataU256NoAc, pCallEntry->idxInstr)
     7211
    71987212#endif
    71997213
     
    97689782    off = iemNativeEmitSimdFetchYregU256(pReNative, off, a_u256Dst, a_iYRegSrc)
    97699783
    9770 
    9771 /** Emits code for IEM_MC_FETCH_YREG_U256. */
     9784#define IEM_MC_FETCH_YREG_YMM(a_uYmmDst, a_iYRegSrc) \
     9785    off = iemNativeEmitSimdFetchYregU256(pReNative, off, a_uYmmDst, a_iYRegSrc)
     9786
     9787/** Emits code for IEM_MC_FETCH_YREG_U256/IEM_MC_FETCH_YREG_YMM. */
    97729788DECL_INLINE_THROW(uint32_t)
    97739789iemNativeEmitSimdFetchYregU256(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxDstVar, uint8_t iYRegSrc)
     
    97939809    off = iemNativeEmitSimdStoreYregU256ZxVlmax(pReNative, off, a_iYRegDst, a_u256Src)
    97949810
    9795 
    9796 /** Emits code for IEM_MC_STORE_YREG_U256_ZX_VLMAX. */
     9811#define IEM_MC_STORE_YREG_YMM_ZX_VLMAX(a_iYRegDst, a_uYmmSrc) \
     9812    off = iemNativeEmitSimdStoreYregU256ZxVlmax(pReNative, off, a_iYRegDst, a_uYmmSrc)
     9813
     9814/** Emits code for IEM_MC_STORE_YREG_U256_ZX_VLMAX/IEM_MC_STORE_YREG_YMM_ZX_VLMAX. */
    97979815DECL_INLINE_THROW(uint32_t)
    97989816iemNativeEmitSimdStoreYregU256ZxVlmax(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t iYRegDst, uint8_t idxSrcVar)
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r104424 r105183  
    8282    'RTUINT128U':       (  128,   False, 'RTUINT128U',      ),
    8383    'X86XMMREG':        (  128,   False, 'X86XMMREG',       ),
     84    'X86YMMREG':        (  256,   False, 'X86YMMREG',       ),
    8485    'IEMMEDIAF2XMMSRC': (  256,   False, 'IEMMEDIAF2XMMSRC',),
    8586    'RTUINT256U':       (  256,   False, 'RTUINT256U',      ),
     
    18361837
    18371838        'IEM_MC_FETCH_YREG_U256':                   '__yreg256',
     1839        'IEM_MC_FETCH_YREG_YMM':                    '__yreg256',
    18381840        'IEM_MC_FETCH_YREG_U128':                   '__yreg128',
    18391841        'IEM_MC_FETCH_YREG_U64':                    '__yreg64',
  • trunk/src/VBox/VMM/include/IEMMc.h

    r105035 r105183  
    633633#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)       \
    634634    (a_pu128Dst) = (&pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].uXmm)
     635#define IEM_MC_REF_XREG_XMM(a_pXmmDst, a_iXReg)       \
     636    (a_pXmmDst) = (&pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)])
    635637#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg) \
    636638    (a_pu128Dst) = ((PCRTUINT128U)&pVCpu->cpum.GstCtx.XState.x87.aXMM[(a_iXReg)].uXmm)
     
    683685         (a_u256Dst).au64[3] = pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegSrcTmp].au64[1]; \
    684686    } while (0)
     687#define IEM_MC_FETCH_YREG_YMM(a_uYmmDst, a_iYRegSrc) \
     688    do { uintptr_t const iYRegSrcTmp    = (a_iYRegSrc); \
     689         (a_uYmmDst).au64[0] = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[0]; \
     690         (a_uYmmDst).au64[1] = pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegSrcTmp].au64[1]; \
     691         (a_uYmmDst).au64[2] = pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegSrcTmp].au64[0]; \
     692         (a_uYmmDst).au64[3] = pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegSrcTmp].au64[1]; \
     693    } while (0)
    685694
    686695#define IEM_MC_STORE_YREG_U128(a_iYRegDst, a_iDQword, a_u128Value) \
     
    730739         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = (a_u256Src).au64[2]; \
    731740         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = (a_u256Src).au64[3]; \
     741         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
     742    } while (0)
     743#define IEM_MC_STORE_YREG_YMM_ZX_VLMAX(a_iYRegDst, a_uYmmSrc) \
     744    do { uintptr_t const iYRegDstTmp    = (a_iYRegDst); \
     745         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[0]       = (a_uYmmSrc).au64[0]; \
     746         pVCpu->cpum.GstCtx.XState.x87.aXMM[iYRegDstTmp].au64[1]       = (a_uYmmSrc).au64[1]; \
     747         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[0] = (a_uYmmSrc).au64[2]; \
     748         pVCpu->cpum.GstCtx.XState.u.YmmHi.aYmmHi[iYRegDstTmp].au64[1] = (a_uYmmSrc).au64[3]; \
    732749         IEM_MC_INT_CLEAR_ZMM_256_UP(iYRegDstTmp); \
    733750    } while (0)
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r104784 r105183  
    843843#define IEM_MC_BROADCAST_XREG_U128_ZX_VLMAX(a_iXRegDst, a_u128Value) do {CHK_XREG_IDX(a_iXRegDst); CHK_VAR(a_u128Value); CHK_TYPE(RTUINT128U, a_u128Value); (void)fAvxWrite; (void)fMcBegin; } while (0)
    844844#define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg)                   do { CHK_XREG_IDX(a_iXReg);    CHK_VAR(a_pu128Dst); (a_pu128Dst) = (PRTUINT128U)((uintptr_t)0);        CHK_PTYPE(PRTUINT128U, a_pu128Dst);     (void)fSseWrite; (void)fMcBegin; } while (0)
     845#define IEM_MC_REF_XREG_XMM(a_pXmmDst, a_iXReg)                     do { CHK_XREG_IDX(a_iXReg);    CHK_VAR(a_pXmmDst);  (a_pXmmDst)  = (PX86XMMREG)((uintptr_t)0);         CHK_PTYPE(PX86XMMREG, a_pXmmDst);       (void)fSseWrite; (void)fMcBegin; } while (0)
    845846#define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg)             do { CHK_XREG_IDX(a_iXReg);    CHK_VAR(a_pu128Dst); (a_pu128Dst) = (PCRTUINT128U)((uintptr_t)0);       CHK_PTYPE(PCRTUINT128U, a_pu128Dst);    (void)fSseWrite; (void)fMcBegin; } while (0)
    846847#define IEM_MC_REF_XREG_U32_CONST(a_pu32Dst, a_iXReg)               do { CHK_XREG_IDX(a_iXReg);    CHK_VAR(a_pu32Dst);  (a_pu32Dst)  = (uint32_t const *)((uintptr_t)0);   CHK_PTYPE(uint32_t const *, a_pu32Dst); (void)fSseWrite; (void)fMcBegin; } while (0)
     
    852853
    853854#define IEM_MC_FETCH_YREG_U256(a_u256Value, a_iYRegSrc)             do { CHK_YREG_IDX(a_iYRegSrc); CHK_VAR(a_u256Value); (a_u256Value).au64[0] = (a_u256Value).au64[1] = (a_u256Value).au64[2] = (a_u256Value).au64[3] = 0; CHK_TYPE(RTUINT256U, a_u256Value); (void)fAvxRead; (void)fMcBegin; } while (0)
     855#define IEM_MC_FETCH_YREG_YMM(a_YmmValue, a_iYRegSrc)               do { CHK_YREG_IDX(a_iYRegSrc); CHK_VAR(a_YmmValue);  (a_YmmValue).au64[0] = (a_YmmValue).au64[1] = (a_YmmValue).au64[2] = (a_YmmValue).au64[3] = 0; CHK_TYPE(X86YMMREG, a_YmmValue); (void)fAvxRead; (void)fMcBegin; } while (0)
    854856#define IEM_MC_FETCH_YREG_U128(a_u128Value, a_iYRegSrc, a_iDQWord)  do { CHK_YREG_IDX(a_iYRegSrc); CHK_VAR(a_u128Value); (a_u128Value).au64[0] = (a_u128Value).au64[1] = 0; CHK_TYPE(RTUINT128U, a_u128Value); (void)fAvxRead; (void)fMcBegin; } while (0)
    855857#define IEM_MC_FETCH_YREG_U64(a_u64Value, a_iYRegSrc, a_iQWord)     do { CHK_YREG_IDX(a_iYRegSrc); CHK_VAR(a_u64Value);  (a_u64Value) = UINT64_MAX; CHK_TYPE(uint64_t, a_u64Value); (void)fAvxRead; (void)fMcBegin; } while (0)
     
    861863#define IEM_MC_STORE_YREG_U128_ZX_VLMAX(a_iYRegDst, a_u128Value)    do { CHK_YREG_IDX(a_iYRegDst); CHK_VAR(a_u128Value); CHK_TYPE(RTUINT128U, a_u128Value); (void)fAvxWrite; (void)fMcBegin; } while (0)
    862864#define IEM_MC_STORE_YREG_U256_ZX_VLMAX(a_iYRegDst, a_u256Value)    do { CHK_YREG_IDX(a_iYRegDst); CHK_VAR(a_u256Value); CHK_TYPE(RTUINT256U, a_u256Value); (void)fAvxWrite; (void)fMcBegin; } while (0)
     865#define IEM_MC_STORE_YREG_YMM_ZX_VLMAX(a_iYRegDst, a_uYmmValue)     do { CHK_YREG_IDX(a_iYRegDst); CHK_VAR(a_uYmmValue); CHK_TYPE(X86YMMREG,  a_uYmmValue); (void)fAvxWrite; (void)fMcBegin; } while (0)
    863866#define IEM_MC_STORE_YREG_U32_U256(a_iYRegDst, a_iDwDst, a_u256Value, a_iDwSrc) do { CHK_XREG_IDX(a_iYRegDst); CHK_VAR(a_u256Value); CHK_TYPE(RTUINT256U, a_u256Value);  AssertCompile((a_iDwDst) < RT_ELEMENTS((a_u256Value).au32)); AssertCompile((a_iDwSrc) < RT_ELEMENTS((a_u256Value).au32)); (void)fAvxWrite; (void)fMcBegin; } while (0)
    864867#define IEM_MC_STORE_YREG_U64_U256(a_iYRegDst, a_iQwDst, a_u256Value, a_iQwSrc) do { CHK_XREG_IDX(a_iYRegDst); CHK_VAR(a_u256Value); CHK_TYPE(RTUINT256U, a_u256Value);  AssertCompile((a_iQwDst) < RT_ELEMENTS((a_u256Value).au64)); AssertCompile((a_iQwSrc) < RT_ELEMENTS((a_u256Value).au64)); (void)fAvxWrite; (void)fMcBegin; } while (0)
     
    924927#define IEM_MC_FETCH_MEM_U256_NO_AC(a_u256Dst, a_iSeg, a_GCPtrMem)      do { CHK_SEG_IDX(a_iSeg); CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_VAR(a_u256Dst); CHK_TYPE(RTUINT256U, a_u256Dst); (void)fMcBegin; } while (0)
    925928#define IEM_MC_FETCH_MEM_U256_ALIGN_AVX(a_u256Dst, a_iSeg, a_GCPtrMem)  do { CHK_SEG_IDX(a_iSeg); CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_VAR(a_u256Dst); CHK_TYPE(RTUINT256U, a_u256Dst); (void)fMcBegin; } while (0)
     929#define IEM_MC_FETCH_MEM_YMM_NO_AC(a_YmmDst, a_iSeg, a_GCPtrMem)        do { CHK_SEG_IDX(a_iSeg); CHK_GCPTR(a_GCPtrMem); CHK_VAR(a_GCPtrMem); CHK_VAR(a_YmmDst);  CHK_TYPE(X86YMMREG,  a_YmmDst);  (void)fMcBegin; } while (0)
    926930
    927931# define IEM_MC_FETCH_MEM_U128_AND_XREG_U128(a_Dst, a_iXReg1, a_iSeg2, a_GCPtrMem2)         \
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