Changeset 103956 in vbox for trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h
- Timestamp:
- Mar 20, 2024 1:39:59 PM (11 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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.