VirtualBox

Changeset 102368 in vbox for trunk


Ignore:
Timestamp:
Nov 28, 2023 2:24:49 PM (15 months ago)
Author:
vboxsync
Message:

VMM/IEM: IEM_MC_FETCH_MEM_U16_DISP and IEM_MC_FETCH_MEM_U32_DISP. bugref:10371

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

Legend:

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

    r102350 r102368  
    29072907    'IEM_MC_FETCH_MEM_U128_AND_XREG_U128_AND_EAX_EDX_U32_SX_U64':(McBlock.parseMcGeneric,           True,  False, ),
    29082908    'IEM_MC_FETCH_MEM_U16':                                      (McBlock.parseMcGeneric,           True,  True,  ),
    2909     'IEM_MC_FETCH_MEM_U16_DISP':                                 (McBlock.parseMcGeneric,           True,  False, ),
     2909    'IEM_MC_FETCH_MEM_U16_DISP':                                 (McBlock.parseMcGeneric,           True,  True, ),
    29102910    'IEM_MC_FETCH_MEM_U16_SX_U32':                               (McBlock.parseMcGeneric,           True,  False, ),
    29112911    'IEM_MC_FETCH_MEM_U16_SX_U64':                               (McBlock.parseMcGeneric,           True,  False, ),
     
    29162916    'IEM_MC_FETCH_MEM_U256_NO_AC':                               (McBlock.parseMcGeneric,           True,  False, ),
    29172917    'IEM_MC_FETCH_MEM_U32':                                      (McBlock.parseMcGeneric,           True,  True,  ),
    2918     'IEM_MC_FETCH_MEM_U32_DISP':                                 (McBlock.parseMcGeneric,           True,  False, ),
     2918    'IEM_MC_FETCH_MEM_U32_DISP':                                 (McBlock.parseMcGeneric,           True,  False, ), #bounds only
    29192919    'IEM_MC_FETCH_MEM_U32_SX_U64':                               (McBlock.parseMcGeneric,           True,  False, ),
    29202920    'IEM_MC_FETCH_MEM_U32_ZX_U64':                               (McBlock.parseMcGeneric,           True,  False, ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp

    r102351 r102368  
    75477547
    75487548
     7549#define IEM_MC_FETCH_MEM_U16_DISP(a_u16Dst, a_iSeg, a_GCPtrMem, a_offDisp) \
     7550    off = iemNativeEmitMemFetchDataCommon(pReNative, off, pCallEntry->idxInstr, a_u16Dst, a_iSeg, a_GCPtrMem, sizeof(uint16_t), a_offDisp)
     7551
     7552#define IEM_MC_FETCH_MEM_U32_DISP(a_u32Dst, a_iSeg, a_GCPtrMem, a_offDisp) \
     7553    off = iemNativeEmitMemFetchDataCommon(pReNative, off, pCallEntry->idxInstr, a_u32Dst, a_iSeg, a_GCPtrMem, sizeof(uint32_t), a_offDisp)
     7554
     7555
    75497556/** Emits code for IEM_MC_FETCH_MEM_U8/16/32/64 and
    75507557 *  IEM_MC_FETCH_MEM_FLAT_U8/16/32/64 (iSegReg = UINT8_MAX). */
    75517558DECL_INLINE_THROW(uint32_t)
    75527559iemNativeEmitMemFetchDataCommon(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxInstr,
    7553                                 uint8_t idxVarDst, uint8_t iSegReg, uint8_t idxVarGCPtrMem, uint8_t cbMem)
     7560                                uint8_t idxVarDst, uint8_t iSegReg, uint8_t idxVarGCPtrMem, uint8_t cbMem, uint8_t offDisp = 0)
    75547561{
    75557562    IEMNATIVE_ASSERT_VAR_IDX(pReNative, idxVarDst);
     
    76557662
    76567663    if (pReNative->Core.aVars[idxVarGCPtrMem].enmKind == kIemNativeVarKind_Immediate)
    7657         off = iemNativeEmitLoadGprImm64(pReNative, off, idxRegArgGCPtrMem, pReNative->Core.aVars[idxVarGCPtrMem].u.uValue);
     7664        off = iemNativeEmitLoadGprImm64(pReNative, off, idxRegArgGCPtrMem,
     7665                                        pReNative->Core.aVars[idxVarGCPtrMem].u.uValue + offDisp);
    76587666    else
    76597667    {
     
    76627670        {
    76637671            Assert(!(RT_BIT_32(idxRegVarGCPtrMem) & IEMNATIVE_CALL_VOLATILE_GREG_MASK));
    7664             off = iemNativeEmitLoadGprFromGpr(pReNative, off, idxRegArgGCPtrMem, idxRegVarGCPtrMem);
     7672            if (!offDisp)
     7673                off = iemNativeEmitLoadGprFromGpr(pReNative, off, idxRegArgGCPtrMem, idxRegVarGCPtrMem);
     7674            else
     7675                off = iemNativeEmitLoadGprFromGprWithAddend(pReNative, off, idxRegArgGCPtrMem, idxRegVarGCPtrMem, offDisp);
    76657676        }
    76667677        else
     
    76687679            AssertFailed(); /** @todo This was probably caused by iemNativeRegMoveAndFreeAndFlushAtCall above. Improve... */
    76697680            off = iemNativeEmitLoadGprByBp(pReNative, off, idxRegArgGCPtrMem, iemNativeVarCalcBpDisp(pReNative, idxVarGCPtrMem));
     7681            if (offDisp)
     7682                off = iemNativeEmitAddGprImm(pReNative, off, idxRegArgGCPtrMem, offDisp);
    76707683        }
    76717684    }
  • trunk/src/VBox/VMM/include/IEMN8veRecompiler.h

    r102313 r102368  
    254254
    255255/** This is the maximum argument count we'll ever be needing. */
    256 #define IEMNATIVE_CALL_MAX_ARG_COUNT        7
     256#if defined(RT_OS_WINDOWS) && defined(VBOXSTRICTRC_STRICT_ENABLED)
     257# define IEMNATIVE_CALL_MAX_ARG_COUNT       8
     258#else
     259# define IEMNATIVE_CALL_MAX_ARG_COUNT       7
     260#endif
    257261/** @} */
    258262
  • trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h

    r102082 r102368  
    721721    uint32_t * const pu32CodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1);
    722722    pu32CodeBuf[off++] = Armv8A64MkInstrBfi(iGprDst, iGprSrc, 8, 8, false /*f64Bit*/);
     723
     724#else
     725# error "port me"
     726#endif
     727    IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off);
     728    return off;
     729}
     730
     731
     732/**
     733 * Emits a gprdst = gprsrc + addend load.
     734 */
     735DECL_INLINE_THROW(uint32_t)
     736iemNativeEmitLoadGprFromGprWithAddend(PIEMRECOMPILERSTATE pReNative, uint32_t off,
     737                                      uint8_t iGprDst, uint8_t iGprSrc, int32_t iAddend)
     738{
     739    Assert(iAddend != 0);
     740
     741#ifdef RT_ARCH_AMD64
     742    /* lea gprdst, [gprsrc + iAddend] */
     743    uint8_t * const pbCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 7);
     744    if ((iGprDst | iGprSrc) >= 8)
     745        pbCodeBuf[off++] = iGprDst < 8  ? X86_OP_REX_W | X86_OP_REX_B
     746                         : iGprSrc >= 8 ? X86_OP_REX_W | X86_OP_REX_R | X86_OP_REX_B
     747                         :                X86_OP_REX_W | X86_OP_REX_R;
     748    else
     749        pbCodeBuf[off++] = X86_OP_REX_W;
     750    pbCodeBuf[off++] = 0x8d;
     751    if (iAddend >= -128 && iAddend < 128)
     752    {
     753        pbCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_MEM1, iGprDst & 7, iGprSrc & 7);
     754        pbCodeBuf[off++] = (int8_t)iAddend;
     755    }
     756    else
     757    {
     758        pbCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_MEM4, iGprDst & 7, iGprSrc & 7);
     759        pbCodeBuf[off++] = RT_BYTE1((uint32_t)iAddend);
     760        pbCodeBuf[off++] = RT_BYTE2((uint32_t)iAddend);
     761        pbCodeBuf[off++] = RT_BYTE3((uint32_t)iAddend);
     762        pbCodeBuf[off++] = RT_BYTE4((uint32_t)iAddend);
     763    }
     764
     765#elif RT_ARCH_ARM64
     766    if ((uint32_t)iAddend < 4096)
     767    {
     768        /* add dst, src, uimm12 */
     769        uint32_t * const pu32CodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1);
     770        pu32CodeBuf[off++] = Armv8A64MkInstrAddSubUImm12(false /*fSub*/, iGprDst, iGprSrc, (uint32_t)iAddend);
     771    }
     772    else if ((uint32_t)-iAddend < 4096)
     773    {
     774        /* sub dst, src, uimm12 */
     775        uint32_t * const pu32CodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1);
     776        pu32CodeBuf[off++] = Armv8A64MkInstrAddSubUImm12(true /*fSub*/, iGprDst, iGprSrc, (uint32_t)-iAddend);
     777    }
     778    else
     779    {
     780        off = iemNativeEmitLoadGprImm64(pReNative, off, iGrpDst, (int64)iAddend);
     781        uint32_t * const pu32CodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1);
     782        pu32CodeBuf[off++] = Armv8A64MkInstrAddSubReg(false /*fSub*/, iGprDst, iGprSrc, iGprDst);
     783    }
    723784
    724785#else
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