VirtualBox

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


Ignore:
Timestamp:
Mar 20, 2024 1:39:59 PM (11 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162333
Message:

VMM/IEM: Implement native emitter for IEM_MC_BROADCAST_YREG_U128_ZX_VLMAX(), bugref:10614

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

Legend:

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

    r103955 r103956  
    29952995    'IEM_MC_BROADCAST_XREG_U64_ZX_VLMAX':                        (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
    29962996    'IEM_MC_BROADCAST_XREG_U8_ZX_VLMAX':                         (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
    2997     'IEM_MC_BROADCAST_YREG_U128_ZX_VLMAX':                       (McBlock.parseMcGeneric,           True,  True,  False, ),
     2997    'IEM_MC_BROADCAST_YREG_U128_ZX_VLMAX':                       (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
    29982998    'IEM_MC_BROADCAST_YREG_U16_ZX_VLMAX':                        (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
    29992999    'IEM_MC_BROADCAST_YREG_U32_ZX_VLMAX':                        (McBlock.parseMcGeneric,           True,  True,  g_fNativeSimd),
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h

    r103953 r103956  
    77327732
    77337733
     7734#define IEM_MC_BROADCAST_YREG_U128_ZX_VLMAX(a_iYRegDst, a_u128Src) \
     7735    off = iemNativeEmitSimdBroadcastYregU128ZxVlmax(pReNative, off, a_iYRegDst, a_u128Src)
     7736
     7737/** Emits code for IEM_MC_BROADCAST_YREG_U128_ZX_VLMAX. */
     7738DECL_INLINE_THROW(uint32_t)
     7739iemNativeEmitSimdBroadcastYregU128ZxVlmax(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t iYReg, uint8_t idxSrcVar)
     7740{
     7741    IEMNATIVE_ASSERT_VAR_IDX(pReNative, idxSrcVar);
     7742    IEMNATIVE_ASSERT_VAR_SIZE(pReNative, idxSrcVar, sizeof(RTUINT128U));
     7743
     7744    uint8_t const idxSimdRegDst = iemNativeSimdRegAllocTmpForGuestSimdReg(pReNative, &off, IEMNATIVEGSTSIMDREG_SIMD(iYReg),
     7745                                                                          kIemNativeGstSimdRegLdStSz_256, kIemNativeGstRegUse_ForFullWrite);
     7746
     7747    uint8_t const idxVarReg = iemNativeVarSimdRegisterAcquire(pReNative, idxSrcVar, &off);
     7748
     7749    off = iemNativeEmitSimdBroadcastVecRegU128ToVecReg(pReNative, off, idxSimdRegDst, idxVarReg);
     7750    IEMNATIVE_SIMD_REG_STATE_SET_DIRTY_LO_U128(pReNative, iYReg);
     7751    IEMNATIVE_SIMD_REG_STATE_SET_DIRTY_HI_U128(pReNative, iYReg);
     7752
     7753    /* Free but don't flush the source register. */
     7754    iemNativeSimdRegFreeTmp(pReNative, idxSimdRegDst);
     7755    iemNativeVarSimdRegisterRelease(pReNative, idxSrcVar);
     7756
     7757    return off;
     7758}
     7759
     7760
    77347761#define IEM_MC_STORE_YREG_U32_ZX_VLMAX(a_iYRegDst, a_u32Src) \
    77357762    off = iemNativeEmitSimdStoreYregU32ZxVlmax(pReNative, off, a_iYRegDst, a_u32Src)
  • trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h

    r103949 r103956  
    88038803}
    88048804
     8805
     8806/**
     8807 * Emits a vecdst[0:127] = vecdst[128:255] = vecsrc[0:127] broadcast, 128-bit.
     8808 */
     8809DECL_FORCE_INLINE(uint32_t)
     8810iemNativeEmitSimdBroadcastVecRegU128ToVecRegEx(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iVecRegDst, uint8_t iVecRegSrc)
     8811{
     8812#ifdef RT_ARCH_AMD64
     8813    off = iemNativeEmitSimdLoadVecRegFromVecRegU128Ex(pCodeBuf, off, iVecRegDst, iVecRegSrc);
     8814
     8815    /* vinserti128 ymm, ymm, xmm, 1. */ /* ASSUMES AVX2 support */
     8816    pCodeBuf[off++] = X86_OP_VEX3;
     8817    pCodeBuf[off++] = X86_OP_VEX3_BYTE1_MAKE(0x3, iVecRegSrc >= 8, false, iVecRegDst >= 8);
     8818    pCodeBuf[off++] = X86_OP_VEX3_BYTE2_MAKE(false, iVecRegSrc, true, X86_OP_VEX3_BYTE2_P_0F3H);
     8819    pCodeBuf[off++] = 0x38;
     8820    pCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, iVecRegDst & 7, iVecRegSrc & 7);
     8821    pCodeBuf[off++] = 0x01; /* Immediate */
     8822#elif defined(RT_ARCH_ARM64)
     8823    /* ASSUMES that there are two adjacent 128-bit registers available for the 256-bit value. */
     8824    Assert(!(iVecRegDst & 0x1));
     8825
     8826    /* mov dst, src;   alias for: orr dst, src, src */
     8827    pCodeBuf[off++] = Armv8A64MkVecInstrOrr(iVecRegDst,     iVecRegSrc, iVecRegSrc);
     8828    pCodeBuf[off++] = Armv8A64MkVecInstrOrr(iVecRegDst + 1, iVecRegSrc, iVecRegSrc);
     8829#else
     8830# error "port me"
     8831#endif
     8832    return off;
     8833}
     8834
     8835
     8836/**
     8837 * Emits a vecdst[0:127] = vecdst[128:255] = vecsrc[0:127] broadcast, 128-bit.
     8838 */
     8839DECL_INLINE_THROW(uint32_t)
     8840iemNativeEmitSimdBroadcastVecRegU128ToVecReg(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t iVecRegDst, uint8_t iVecRegSrc)
     8841{
     8842#ifdef RT_ARCH_AMD64
     8843    off = iemNativeEmitSimdBroadcastVecRegU128ToVecRegEx(iemNativeInstrBufEnsure(pReNative, off, 11), off, iVecRegDst, iVecRegSrc);
     8844#elif defined(RT_ARCH_ARM64)
     8845    off = iemNativeEmitSimdBroadcastVecRegU128ToVecRegEx(iemNativeInstrBufEnsure(pReNative, off, 2), off, iVecRegDst, iVecRegSrc);
     8846#else
     8847# error "port me"
     8848#endif
     8849    IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off);
     8850    return off;
     8851}
     8852
    88058853#endif /* IEMNATIVE_WITH_SIMD_REG_ALLOCATOR */
    88068854
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