VirtualBox

Ignore:
Timestamp:
Mar 20, 2024 1:39:59 PM (11 months ago)
Author:
vboxsync
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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