Changeset 103956 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Mar 20, 2024 1:39:59 PM (11 months ago)
- svn:sync-xref-src-repo-rev:
- 162333
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py
r103955 r103956 2995 2995 'IEM_MC_BROADCAST_XREG_U64_ZX_VLMAX': (McBlock.parseMcGeneric, True, True, g_fNativeSimd), 2996 2996 '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), 2998 2998 'IEM_MC_BROADCAST_YREG_U16_ZX_VLMAX': (McBlock.parseMcGeneric, True, True, g_fNativeSimd), 2999 2999 'IEM_MC_BROADCAST_YREG_U32_ZX_VLMAX': (McBlock.parseMcGeneric, True, True, g_fNativeSimd), -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h
r103953 r103956 7732 7732 7733 7733 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. */ 7738 DECL_INLINE_THROW(uint32_t) 7739 iemNativeEmitSimdBroadcastYregU128ZxVlmax(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 7734 7761 #define IEM_MC_STORE_YREG_U32_ZX_VLMAX(a_iYRegDst, a_u32Src) \ 7735 7762 off = iemNativeEmitSimdStoreYregU32ZxVlmax(pReNative, off, a_iYRegDst, a_u32Src) -
trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h
r103949 r103956 8803 8803 } 8804 8804 8805 8806 /** 8807 * Emits a vecdst[0:127] = vecdst[128:255] = vecsrc[0:127] broadcast, 128-bit. 8808 */ 8809 DECL_FORCE_INLINE(uint32_t) 8810 iemNativeEmitSimdBroadcastVecRegU128ToVecRegEx(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 */ 8839 DECL_INLINE_THROW(uint32_t) 8840 iemNativeEmitSimdBroadcastVecRegU128ToVecReg(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 8805 8853 #endif /* IEMNATIVE_WITH_SIMD_REG_ALLOCATOR */ 8806 8854
Note:
See TracChangeset
for help on using the changeset viewer.