Changeset 103916 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Mar 19, 2024 1:11:09 PM (11 months ago)
- svn:sync-xref-src-repo-rev:
- 162290
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r103908 r103916 7226 7226 #include "IEMAllMemRWTmpl.cpp.h" 7227 7227 7228 #define TMPL_MEM_TYPE RTUINT256U 7229 #define TMPL_MEM_TYPE_ALIGN 0 7230 #define TMPL_MEM_FN_SUFF U256NoAc 7231 #define TMPL_MEM_FMT_TYPE "%.32Rhxs" 7232 #define TMPL_MEM_FMT_DESC "qqword" 7233 #include "IEMAllMemRWTmpl.cpp.h" 7234 7228 7235 /** 7229 7236 * Fetches a data dword and zero extends it to a qword. … … 7282 7289 #endif 7283 7290 return rc; 7284 }7285 #endif7286 7287 7288 /**7289 * Fetches a data oword (octo word), generally AVX related.7290 *7291 * @returns Strict VBox status code.7292 * @param pVCpu The cross context virtual CPU structure of the calling thread.7293 * @param pu256Dst Where to return the qword.7294 * @param iSegReg The index of the segment register to use for7295 * this access. The base and limits are checked.7296 * @param GCPtrMem The address of the guest memory.7297 */7298 VBOXSTRICTRC iemMemFetchDataU256NoAc(PVMCPUCC pVCpu, PRTUINT256U pu256Dst, uint8_t iSegReg, RTGCPTR GCPtrMem) RT_NOEXCEPT7299 {7300 /* The lazy approach for now... */7301 uint8_t bUnmapInfo;7302 PCRTUINT256U pu256Src;7303 VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu256Src, &bUnmapInfo, sizeof(*pu256Src), iSegReg, GCPtrMem,7304 IEM_ACCESS_DATA_R, 0 /* NO_AC variant */);7305 if (rc == VINF_SUCCESS)7306 {7307 pu256Dst->au64[0] = pu256Src->au64[0];7308 pu256Dst->au64[1] = pu256Src->au64[1];7309 pu256Dst->au64[2] = pu256Src->au64[2];7310 pu256Dst->au64[3] = pu256Src->au64[3];7311 rc = iemMemCommitAndUnmap(pVCpu, bUnmapInfo);7312 Log(("IEM RD qqword %d|%RGv: %.32Rhxs\n", iSegReg, GCPtrMem, pu256Dst));7313 }7314 return rc;7315 }7316 7317 7318 #ifdef IEM_WITH_SETJMP7319 /**7320 * Fetches a data oword (octo word), generally AVX related.7321 *7322 * @param pVCpu The cross context virtual CPU structure of the calling thread.7323 * @param pu256Dst Where to return the qword.7324 * @param iSegReg The index of the segment register to use for7325 * this access. The base and limits are checked.7326 * @param GCPtrMem The address of the guest memory.7327 */7328 void iemMemFetchDataU256NoAcJmp(PVMCPUCC pVCpu, PRTUINT256U pu256Dst, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP7329 {7330 /* The lazy approach for now... */7331 uint8_t bUnmapInfo;7332 PCRTUINT256U pu256Src = (PCRTUINT256U)iemMemMapJmp(pVCpu, &bUnmapInfo, sizeof(*pu256Src), iSegReg, GCPtrMem,7333 IEM_ACCESS_DATA_R, 0 /* NO_AC variant */);7334 pu256Dst->au64[0] = pu256Src->au64[0];7335 pu256Dst->au64[1] = pu256Src->au64[1];7336 pu256Dst->au64[2] = pu256Src->au64[2];7337 pu256Dst->au64[3] = pu256Src->au64[3];7338 iemMemCommitAndUnmapJmp(pVCpu, bUnmapInfo);7339 Log(("IEM RD qqword %d|%RGv: %.32Rhxs\n", iSegReg, GCPtrMem, pu256Dst));7340 7291 } 7341 7292 #endif … … 7572 7523 */ 7573 7524 void iemMemStoreDataU256Jmp(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, PCRTUINT256U pu256Value) IEM_NOEXCEPT_MAY_LONGJMP 7574 {7575 /* The lazy approach for now... */7576 uint8_t bUnmapInfo;7577 PRTUINT256U pu256Dst = (PRTUINT256U)iemMemMapJmp(pVCpu, &bUnmapInfo, sizeof(*pu256Dst), iSegReg, GCPtrMem,7578 IEM_ACCESS_DATA_W, 0 /* NO_AC variant */);7579 pu256Dst->au64[0] = pu256Value->au64[0];7580 pu256Dst->au64[1] = pu256Value->au64[1];7581 pu256Dst->au64[2] = pu256Value->au64[2];7582 pu256Dst->au64[3] = pu256Value->au64[3];7583 iemMemCommitAndUnmapJmp(pVCpu, bUnmapInfo);7584 Log5(("IEM WR qqword %d|%RGv: %.32Rhxs\n", iSegReg, GCPtrMem, pu256Dst));7585 }7586 #endif7587 7588 7589 /**7590 * Stores a data qqword.7591 *7592 * @returns Strict VBox status code.7593 * @param pVCpu The cross context virtual CPU structure of the calling thread.7594 * @param iSegReg The index of the segment register to use for7595 * this access. The base and limits are checked.7596 * @param GCPtrMem The address of the guest memory.7597 * @param pu256Value Pointer to the value to store.7598 */7599 VBOXSTRICTRC iemMemStoreDataU256NoAc(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, PCRTUINT256U pu256Value) RT_NOEXCEPT7600 {7601 /* The lazy approach for now... */7602 uint8_t bUnmapInfo;7603 PRTUINT256U pu256Dst;7604 VBOXSTRICTRC rc = iemMemMap(pVCpu, (void **)&pu256Dst, &bUnmapInfo, sizeof(*pu256Dst), iSegReg, GCPtrMem,7605 IEM_ACCESS_DATA_W, 0 /* NO_AC variant */);7606 if (rc == VINF_SUCCESS)7607 {7608 pu256Dst->au64[0] = pu256Value->au64[0];7609 pu256Dst->au64[1] = pu256Value->au64[1];7610 pu256Dst->au64[2] = pu256Value->au64[2];7611 pu256Dst->au64[3] = pu256Value->au64[3];7612 rc = iemMemCommitAndUnmap(pVCpu, bUnmapInfo);7613 Log5(("IEM WR qqword %d|%RGv: %.32Rhxs\n", iSegReg, GCPtrMem, pu256Dst));7614 }7615 return rc;7616 }7617 7618 7619 #ifdef IEM_WITH_SETJMP7620 /**7621 * Stores a data qqword, longjmp on error.7622 *7623 * @param pVCpu The cross context virtual CPU structure of the calling thread.7624 * @param iSegReg The index of the segment register to use for7625 * this access. The base and limits are checked.7626 * @param GCPtrMem The address of the guest memory.7627 * @param pu256Value Pointer to the value to store.7628 */7629 void iemMemStoreDataU256NoAcJmp(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, PCRTUINT256U pu256Value) IEM_NOEXCEPT_MAY_LONGJMP7630 7525 { 7631 7526 /* The lazy approach for now... */ -
trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py
r103911 r103916 3069 3069 'IEM_MC_FETCH_MEM_U256': (McBlock.parseMcGeneric, True, True, False, ), 3070 3070 'IEM_MC_FETCH_MEM_U256_ALIGN_AVX': (McBlock.parseMcGeneric, True, True, False, ), 3071 'IEM_MC_FETCH_MEM_U256_NO_AC': (McBlock.parseMcGeneric, True, True, False,),3071 'IEM_MC_FETCH_MEM_U256_NO_AC': (McBlock.parseMcGeneric, True, True, g_fNativeSimd), 3072 3072 'IEM_MC_FETCH_MEM_U32': (McBlock.parseMcGeneric, True, True, True, ), 3073 3073 'IEM_MC_FETCH_MEM_U32_DISP': (McBlock.parseMcGeneric, True, True, True, ), #bounds only -
trunk/src/VBox/VMM/VMMAll/IEMAllN8vePython.py
r103911 r103916 149 149 'IEM_MC_FETCH_MEM_FLAT_U16_ZX_U64': (None, True, True, True, ), 150 150 'IEM_MC_FETCH_MEM_FLAT_U256_ALIGN_AVX': (None, True, True, False, ), 151 'IEM_MC_FETCH_MEM_FLAT_U256_NO_AC': (None, True, True, False,),151 'IEM_MC_FETCH_MEM_FLAT_U256_NO_AC': (None, True, True, g_fNativeSimd), 152 152 'IEM_MC_FETCH_MEM_FLAT_U256': (None, True, True, False, ), 153 153 'IEM_MC_FETCH_MEM_FLAT_U32': (None, True, True, True, ), -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompFuncs.h
r103911 r103916 4715 4715 && (pfnFunction == UINT64_C(0xc000b000a0009000)))); 4716 4716 break; 4717 case sizeof(RTUINT256U): 4718 Assert(enmOp == kIemNativeEmitMemOp_Store || enmOp == kIemNativeEmitMemOp_Fetch); 4719 Assert( ( enmOp == kIemNativeEmitMemOp_Fetch 4720 && (pfnFunction == (uintptr_t)iemNativeHlpMemFlatFetchDataU256NoAc)) 4721 || ( enmOp == kIemNativeEmitMemOp_Store 4722 && (pfnFunction == UINT64_C(0xc000b000a0009000)))); 4723 break; 4717 4724 #endif 4718 4725 } … … 4765 4772 && ( pfnFunction == (uintptr_t)iemNativeHlpMemFetchDataU128AlignedSse 4766 4773 || pfnFunction == (uintptr_t)iemNativeHlpMemFetchDataU128NoAc)) 4774 || ( enmOp == kIemNativeEmitMemOp_Store 4775 && (pfnFunction == UINT64_C(0xc000b000a0009000)))); 4776 break; 4777 case sizeof(RTUINT256U): 4778 Assert(enmOp == kIemNativeEmitMemOp_Store || enmOp == kIemNativeEmitMemOp_Fetch); 4779 Assert( ( enmOp == kIemNativeEmitMemOp_Fetch 4780 && (pfnFunction == (uintptr_t)iemNativeHlpMemFetchDataU256NoAc)) 4767 4781 || ( enmOp == kIemNativeEmitMemOp_Store 4768 4782 && (pfnFunction == UINT64_C(0xc000b000a0009000)))); … … 5079 5093 off = iemNativeEmitLoadGprByGprU64Ex(pCodeBuf, off, idxRegValueFetch, idxRegMemResult); 5080 5094 break; 5095 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR 5081 5096 case sizeof(RTUINT128U): 5082 5097 /* 5083 * No need to back the register with the stack, this is done by the generic variable handling5098 * No need to sync back the register with the stack, this is done by the generic variable handling 5084 5099 * code if there is a register assigned to a variable and the stack must be accessed. 5085 5100 */ 5086 5101 off = iemNativeEmitLoadVecRegByGprU128Ex(pCodeBuf, off, idxRegValueFetch, idxRegMemResult); 5087 5102 break; 5103 case sizeof(RTUINT256U): 5104 /* 5105 * No need to sync back the register with the stack, this is done by the generic variable handling 5106 * code if there is a register assigned to a variable and the stack must be accessed. 5107 */ 5108 off = iemNativeEmitLoadVecRegByGprU256Ex(pCodeBuf, off, idxRegValueFetch, idxRegMemResult); 5109 break; 5110 #endif 5088 5111 default: 5089 5112 AssertFailed(); … … 5371 5394 sizeof(RTUINT128U), sizeof(RTUINT128U) - 1, kIemNativeEmitMemOp_Fetch, \ 5372 5395 (uintptr_t)iemNativeHlpMemFlatFetchDataU128NoAc, pCallEntry->idxInstr) 5396 5397 /* 256-bit segmented: */ 5398 #define IEM_MC_FETCH_MEM_U256_NO_AC(a_u256Dst, a_iSeg, a_GCPtrMem) \ 5399 off = iemNativeEmitMemFetchStoreDataCommon(pReNative, off, a_u256Dst, a_iSeg, a_GCPtrMem, \ 5400 sizeof(RTUINT256U), sizeof(RTUINT256U) - 1, kIemNativeEmitMemOp_Fetch, \ 5401 (uintptr_t)iemNativeHlpMemFetchDataU256NoAc, pCallEntry->idxInstr) 5402 5403 /* 256-bit flat: */ 5404 #define IEM_MC_FETCH_MEM_FLAT_U256_NO_AC(a_u256Dst, a_GCPtrMem) \ 5405 off = iemNativeEmitMemFetchStoreDataCommon(pReNative, off, a_u256Dst, UINT8_MAX, a_GCPtrMem, \ 5406 sizeof(RTUINT256U), sizeof(RTUINT256U) - 1, kIemNativeEmitMemOp_Fetch, \ 5407 (uintptr_t)iemNativeHlpMemFlatFetchDataU256NoAc, pCallEntry->idxInstr) 5373 5408 #endif 5374 5409 -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp
r103913 r103916 1896 1896 #endif 1897 1897 } 1898 1899 1900 /** 1901 * Used by TB code to load 256-bit data w/ segmentation. 1902 */ 1903 IEM_DECL_NATIVE_HLP_DEF(void, iemNativeHlpMemFetchDataU256NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PRTUINT256U pu256Dst)) 1904 { 1905 #ifdef IEMNATIVE_WITH_TLB_LOOKUP_FETCH 1906 iemMemFetchDataU256NoAcSafeJmp(pVCpu, pu256Dst, iSegReg, GCPtrMem); 1907 #else 1908 iemMemFetchDataU256NoAcJmp(pVCpu, pu256Dst, iSegReg, GCPtrMem); 1909 #endif 1910 } 1898 1911 #endif 1899 1912 … … 2217 2230 #else 2218 2231 return iemMemFlatFetchDataU128NoAcJmp(pVCpu, pu128Dst, UINT8_MAX, GCPtrMem); 2232 #endif 2233 } 2234 2235 2236 /** 2237 * Used by TB code to load unsigned 256-bit data w/ flat address. 2238 */ 2239 IEM_DECL_NATIVE_HLP_DEF(void, iemNativeHlpMemFlatFetchDataU256NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PRTUINT256U pu256Dst)) 2240 { 2241 #ifdef IEMNATIVE_WITH_TLB_LOOKUP_FETCH 2242 return iemMemFetchDataU256NoAcSafeJmp(pVCpu, pu256Dst, UINT8_MAX, GCPtrMem); 2243 #else 2244 return iemMemFlatFetchDataU256NoAcJmp(pVCpu, pu256Dst, UINT8_MAX, GCPtrMem); 2219 2245 #endif 2220 2246 } -
trunk/src/VBox/VMM/include/IEMInline.h
r103908 r103916 4106 4106 #undef TMPL_MEM_NO_MAPPING 4107 4107 4108 #define TMPL_MEM_NO_MAPPING 4109 #define TMPL_MEM_TYPE RTUINT256U 4110 #define TMPL_MEM_TYPE_ALIGN 0 4111 #define TMPL_MEM_TYPE_SIZE 32 4112 #define TMPL_MEM_FN_SUFF U256NoAc 4113 #define TMPL_MEM_FMT_TYPE "%.32Rhxs" 4114 #define TMPL_MEM_FMT_DESC "qqword" 4115 #include "../VMMAll/IEMAllMemRWTmplInline.cpp.h" 4116 #undef TMPL_MEM_NO_MAPPING 4108 4117 4109 4118 #undef TMPL_MEM_CHECK_UNALIGNED_WITHIN_PAGE_OK -
trunk/src/VBox/VMM/include/IEMInternal.h
r103909 r103916 5488 5488 void iemMemFetchDataU128NoAcJmp(PVMCPUCC pVCpu, PRTUINT128U pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP; 5489 5489 void iemMemFetchDataU128AlignedSseJmp(PVMCPUCC pVCpu, PRTUINT128U pu128Dst, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP; 5490 void iemMemFetchDataU256NoAcJmp(PVMCPUCC pVCpu, PRTUINT256U pu256Dst, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP; 5490 5491 # endif 5491 5492 void iemMemFetchDataU256Jmp(PVMCPUCC pVCpu, PRTUINT256U pu256Dst, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP; 5492 void iemMemFetchDataU256NoAcJmp(PVMCPUCC pVCpu, PRTUINT256U pu256Dst, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP;5493 5493 void iemMemFetchDataU256AlignedSseJmp(PVMCPUCC pVCpu, PRTUINT256U pu256Dst, uint8_t iSegReg, RTGCPTR GCPtrMem) IEM_NOEXCEPT_MAY_LONGJMP; 5494 5494 #endif … … 5531 5531 void iemMemStoreDataU128Jmp(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, RTUINT128U u128Value) IEM_NOEXCEPT_MAY_LONGJMP; 5532 5532 void iemMemStoreDataNoAcU128Jmp(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, RTUINT128U u128Value) IEM_NOEXCEPT_MAY_LONGJMP; 5533 void iemMemStoreDataU256NoAcJmp(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, PCRTUINT256U pu256Value) IEM_NOEXCEPT_MAY_LONGJMP; 5533 5534 #endif 5534 5535 void iemMemStoreDataU128AlignedSseJmp(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, RTUINT128U u128Value) IEM_NOEXCEPT_MAY_LONGJMP; 5535 5536 void iemMemStoreDataU256Jmp(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, PCRTUINT256U pu256Value) IEM_NOEXCEPT_MAY_LONGJMP; 5536 void iemMemStoreDataU256NoAcJmp(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, PCRTUINT256U pu256Value) IEM_NOEXCEPT_MAY_LONGJMP;5537 5537 void iemMemStoreDataU256AlignedAvxJmp(PVMCPUCC pVCpu, uint8_t iSegReg, RTGCPTR GCPtrMem, PCRTUINT256U pu256Value) IEM_NOEXCEPT_MAY_LONGJMP; 5538 5538 #endif -
trunk/src/VBox/VMM/include/IEMN8veRecompiler.h
r103911 r103916 1648 1648 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFetchDataU128AlignedSse,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PRTUINT128U pu128Dst)); 1649 1649 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFetchDataU128NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PRTUINT128U pu128Dst)); 1650 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFetchDataU256NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, PRTUINT256U pu256Dst)); 1650 1651 #endif 1651 1652 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemStoreDataU8,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t iSegReg, uint8_t u8Value)); … … 1674 1675 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatFetchDataU128AlignedSse,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PRTUINT128U pu128Dst)); 1675 1676 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatFetchDataU128NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PRTUINT128U pu128Dst)); 1677 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatFetchDataU256NoAc,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, PRTUINT256U pu256Dst)); 1676 1678 #endif 1677 1679 IEM_DECL_NATIVE_HLP_PROTO(void, iemNativeHlpMemFlatStoreDataU8,(PVMCPUCC pVCpu, RTGCPTR GCPtrMem, uint8_t u8Value)); -
trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h
r103911 r103916 2464 2464 } 2465 2465 2466 # ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR 2467 /** 2468 * Common bit of iemNativeEmitLoadVecRegByGprU128 and friends. 2469 * 2470 * @note Odd and large @a offDisp values requires a temporary, unless it's a 2471 * load and @a iGprReg differs from @a iGprBase. Will assert / throw if 2472 * caller does not heed this. 2473 * 2474 * @note DON'T try this with prefetch. 2475 */ 2476 DECL_FORCE_INLINE_THROW(uint32_t) 2477 iemNativeEmitVecRegByGprLdStEx(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iVecReg, uint8_t iGprBase, int32_t offDisp, 2478 ARMV8A64INSTRLDSTTYPE enmOperation, unsigned cbData, uint8_t iGprTmp = UINT8_MAX) 2479 { 2480 if ((uint32_t)offDisp < _4K * cbData && !((uint32_t)offDisp & (cbData - 1))) 2481 { 2482 /* Use the unsigned variant of ldr Wt, [<Xn|SP>, #off]. */ 2483 pCodeBuf[off++] = Armv8A64MkInstrStLdRUOff(enmOperation, iVecReg, iGprBase, (uint32_t)offDisp / cbData); 2484 } 2485 else if ( !ARMV8A64INSTRLDSTTYPE_IS_STORE(enmOperation) 2486 || iGprTmp != UINT8_MAX) 2487 { 2488 /* The offset is too large, so we must load it into a register and use 2489 ldr Wt, [<Xn|SP>, (<Wm>|<Xm>)]. */ 2490 /** @todo reduce by offVCpu by >> 3 or >> 2? if it saves instructions? */ 2491 off = iemNativeEmitLoadGprImmEx(pCodeBuf, off, iGprTmp, (int64_t)offDisp); 2492 pCodeBuf[off++] = Armv8A64MkInstrStLdRegIdx(enmOperation, iVecReg, iGprBase, iGprTmp); 2493 } 2494 else 2495 # ifdef IEM_WITH_THROW_CATCH 2496 AssertFailedStmt(IEMNATIVE_DO_LONGJMP(NULL, VERR_IEM_IPE_9)); 2497 # else 2498 AssertReleaseFailedStmt(off = UINT32_MAX); 2499 # endif 2500 return off; 2501 } 2502 # endif 2503 2466 2504 #endif /* RT_ARCH_ARM64 */ 2467 2505 … … 2878 2916 2879 2917 #elif defined(RT_ARCH_ARM64) 2880 off = iemNativeEmit GprByGprLdStEx(pCodeBuf, off, iVecRegDst, iGprBase, offDisp,2881 kArmv8A64InstrLdStType_Ld_Vr_128, sizeof(RTUINT128U), iGprTmp);2918 off = iemNativeEmitVecRegByGprLdStEx(pCodeBuf, off, iVecRegDst, iGprBase, offDisp, 2919 kArmv8A64InstrLdStType_Ld_Vr_128, sizeof(RTUINT128U), iGprTmp); 2882 2920 2883 2921 #else … … 2900 2938 #elif defined(RT_ARCH_ARM64) 2901 2939 off = iemNativeEmitGprByGprLdSt(pReNative, off, iVecRegDst, iGprBase, offDisp, kArmv8A64InstrLdStType_Ld_Vr_128, sizeof(RTUINT128U)); 2940 2941 #else 2942 # error "port me" 2943 #endif 2944 return off; 2945 } 2946 2947 2948 /** 2949 * Emits a 256-bit vector register load via a GPR base address with a displacement. 2950 * 2951 * @note ARM64: Misaligned @a offDisp values and values not in the 2952 * -0x7ff8...0x7ff8 range will require a temporary register (@a iGprTmp) if 2953 * @a iGprReg and @a iGprBase are the same. Will assert / throw if caller 2954 * does not heed this. 2955 */ 2956 DECL_FORCE_INLINE_THROW(uint32_t) 2957 iemNativeEmitLoadVecRegByGprU256Ex(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iVecRegDst, uint8_t iGprBase, 2958 int32_t offDisp = 0, uint8_t iGprTmp = UINT8_MAX) 2959 { 2960 #ifdef RT_ARCH_AMD64 2961 /* vmovdqu reg256, mem256 */ 2962 pCodeBuf[off++] = X86_OP_VEX3; 2963 pCodeBuf[off++] = (iVecRegDst < 8 ? X86_OP_VEX3_BYTE1_R : 0) 2964 | X86_OP_VEX3_BYTE1_X 2965 | (iGprBase < 8 ? X86_OP_VEX3_BYTE1_B : 0) 2966 | UINT8_C(0x01); 2967 pCodeBuf[off++] = X86_OP_VEX3_BYTE2_MAKE_NO_VVVV(false /*f64BitOpSz*/, true /*f256BitAvx*/, X86_OP_VEX2_BYTE1_P_0F3H); 2968 pCodeBuf[off++] = 0x6f; 2969 off = iemNativeEmitGprByGprDisp(pCodeBuf, off, iVecRegDst, iGprBase, offDisp); 2970 RT_NOREF(iGprTmp); 2971 2972 #elif defined(RT_ARCH_ARM64) 2973 Assert(!(iVecRegDst & 0x1)); 2974 off = iemNativeEmitVecRegByGprLdStEx(pCodeBuf, off, iVecRegDst, iGprBase, offDisp, 2975 kArmv8A64InstrLdStType_Ld_Vr_128, sizeof(RTUINT128U), iGprTmp); 2976 off = iemNativeEmitVecRegByGprLdStEx(pCodeBuf, off, iVecRegDst + 1, iGprBase, offDisp + sizeof(RTUINT128U), 2977 kArmv8A64InstrLdStType_Ld_Vr_128, sizeof(RTUINT128U), iGprTmp); 2978 #else 2979 # error "port me" 2980 #endif 2981 return off; 2982 } 2983 2984 2985 /** 2986 * Emits a 256-bit GPR load via a GPR base address with a displacement. 2987 */ 2988 DECL_INLINE_THROW(uint32_t) 2989 iemNativeEmitLoadVecRegByGprU256(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t iVecRegDst, uint8_t iGprBase, int32_t offDisp) 2990 { 2991 #ifdef RT_ARCH_AMD64 2992 off = iemNativeEmitLoadVecRegByGprU128Ex(iemNativeInstrBufEnsure(pReNative, off, 8), off, iVecRegDst, iGprBase, offDisp); 2993 IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); 2994 2995 #elif defined(RT_ARCH_ARM64) 2996 Assert(!(iVecRegDst & 0x1)); 2997 off = iemNativeEmitGprByGprLdSt(pReNative, off, iVecRegDst, iGprBase, offDisp, 2998 kArmv8A64InstrLdStType_Ld_Vr_128, sizeof(RTUINT128U)); 2999 off = iemNativeEmitGprByGprLdSt(pReNative, off, iVecRegDst + 1, iGprBase, offDisp + sizeof(RTUINT128U), 3000 kArmv8A64InstrLdStType_Ld_Vr_128, sizeof(RTUINT128U)); 2902 3001 2903 3002 #else
Note:
See TracChangeset
for help on using the changeset viewer.