- Timestamp:
- Dec 31, 2023 1:06:09 AM (9 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
-
VMMAll/IEMAllN8veRecompiler.cpp (modified) (7 diffs)
-
include/IEMN8veRecompilerEmit.h (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp
r102735 r102736 9968 9968 *********************************************************************************************************************************/ 9969 9969 9970 #if (defined(RT_ARCH_AMD64) && 1) || (defined(RT_ARCH_ARM64) && 0)9970 #if (defined(RT_ARCH_AMD64) && 1) || (defined(RT_ARCH_ARM64) && 1) 9971 9971 # define IEMNATIVE_WITH_TLB_LOOKUP 9972 9972 #endif … … 10118 10118 { 10119 10119 off = iemNativeEmitBrkEx(pCodeBuf, off, 1); /** @todo this needs testing */ 10120 /* cmp seglim, regptr */ 10120 /* cmp seglim, regptr */ /** @todo r=bird: why 64-bit compare again? */ 10121 10121 if (pTlbState->idxRegPtr != UINT8_MAX) 10122 10122 off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxRegSegLimit, pTlbState->idxRegPtr); … … 10136 10136 /* cmp reg1, reg2 (64-bit) / imm (32-bit) */ 10137 10137 if (pTlbState->idxRegPtr != UINT8_MAX) 10138 off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxReg1, pTlbState->idxReg2); 10138 off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxReg1, 10139 cbMem > 1 ? pTlbState->idxReg2 : pTlbState->idxRegPtr); 10139 10140 else 10140 10141 off = iemNativeEmitCmpGpr32WithImmEx(pCodeBuf, off, pTlbState->idxReg1, (uint32_t)(pTlbState->uAbsPtr + cbMem - 1)); … … 10150 10151 */ 10151 10152 iemNativeLabelDefine(pReNative, idxLabelTlbLookup, off); 10152 # if defined(RT_ARCH_ARM64) 10153 off = iemNativeEmitBrkEx(pCodeBuf, off, 0); /** @todo debug on arm */10153 # if defined(RT_ARCH_ARM64) && 0 10154 off = iemNativeEmitBrkEx(pCodeBuf, off, 0); 10154 10155 # endif 10155 10156 … … 10397 10398 off = iemNativeEmitAddGprImmEx(pCodeBuf, off, pTlbState->idxReg2, RT_UOFFSETOF(VMCPUCC, iem.s.DataTlb.aEntries), 10398 10399 pTlbState->idxReg3 /*iGprTmp*/); 10399 10400 /* reg2 += pVCpu */ 10401 off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, pTlbState->idxReg2, IEMNATIVE_REG_FIXED_PVMCPU); 10400 10402 # else 10401 10403 # error "Port me" … … 10411 10413 off = iemNativeEmitGprByGprDisp(pCodeBuf, off, pTlbState->idxReg1, pTlbState->idxReg2, RT_UOFFSETOF(IEMTLBENTRY, uTag)); 10412 10414 # elif defined(RT_ARCH_ARM64) 10413 pCodeBuf[off++] = Armv8A64MkInstrStLdRUOff(kArmv8A64InstrLdStType_Ld_Dword, pTlbState->idxReg3, 10414 pTlbState->idxReg2, RT_UOFFSETOF(IEMTLBENTRY, uTag)); 10415 off = iemNativeEmitLoadGprByGprEx(pCodeBuf, off, pTlbState->idxReg3, pTlbState->idxReg2, RT_UOFFSETOF(IEMTLBENTRY, uTag)); 10415 10416 off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxReg1, pTlbState->idxReg3); 10416 10417 # else … … 10443 10444 RT_UOFFSETOF(VMCPUCC, iem.s.DataTlb.uTlbPhysRev)); 10444 10445 # elif defined(RT_ARCH_ARM64) 10445 pCodeBuf[off++] = Armv8A64MkInstrStLdRUOff(kArmv8A64InstrLdStType_Ld_Dword, pTlbState->idxReg3,10446 pTlbState->idxReg2,RT_UOFFSETOF(IEMTLBENTRY, fFlagsAndPhysRev));10446 off = iemNativeEmitLoadGprByGprEx(pCodeBuf, off, pTlbState->idxReg3, pTlbState->idxReg2, 10447 RT_UOFFSETOF(IEMTLBENTRY, fFlagsAndPhysRev)); 10447 10448 pCodeBuf[off++] = Armv8A64MkInstrAnd(pTlbState->idxReg1, pTlbState->idxReg1, pTlbState->idxReg3); 10448 off = iemNativeEmitLoadGprFromVCpuU64Ex(pCodeBuf, off, pTlbState->idxReg3, RT_UOFFSETOF(VMCPUCC, iem.s.DataTlb.uTlbPhysRev));10449 off = iemNativeEmitLoadGprFromVCpuU64Ex(pCodeBuf, off, pTlbState->idxReg3, RT_UOFFSETOF(VMCPUCC, iem.s.DataTlb.uTlbPhysRev)); 10449 10450 off = iemNativeEmitCmpGprWithGprEx(pCodeBuf, off, pTlbState->idxReg1, pTlbState->idxReg3); 10450 10451 # else -
trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h
r102735 r102736 2503 2503 } 2504 2504 else 2505 off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprDst == iGprAddend1 ? iGprAddend1 : iGprAddend2);2505 off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprDst != iGprAddend1 ? iGprAddend1 : iGprAddend2); 2506 2506 2507 2507 #elif defined(RT_ARCH_ARM64) … … 2531 2531 } 2532 2532 else 2533 off = iemNativeEmitAddTwoGprs32Ex(pCodeBuf, off, iGprDst, iGprDst == iGprAddend1 ? iGprAddend1 : iGprAddend2);2533 off = iemNativeEmitAddTwoGprs32Ex(pCodeBuf, off, iGprDst, iGprDst != iGprAddend1 ? iGprAddend1 : iGprAddend2); 2534 2534 2535 2535 #elif defined(RT_ARCH_ARM64) … … 2551 2551 */ 2552 2552 DECL_FORCE_INLINE_THROW(uint32_t) 2553 iemNativeEmitGprEqGprPlusImmEx(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iGprDst, uint8_t iGprAddend, int 32_t iImmAddend)2553 iemNativeEmitGprEqGprPlusImmEx(PIEMNATIVEINSTR pCodeBuf, uint32_t off, uint8_t iGprDst, uint8_t iGprAddend, int64_t iImmAddend) 2554 2554 { 2555 2555 #ifdef RT_ARCH_AMD64 … … 2557 2557 if ((int8_t)iImmAddend == iImmAddend) 2558 2558 { 2559 /* mov dst, gpradd */2560 2559 off = iemNativeEmitLoadGprFromGprEx(pCodeBuf, off, iGprDst, iGprAddend); 2561 /* add dst, immadd */2562 2560 off = iemNativeEmitAddGprImm8Ex(pCodeBuf, off, iGprDst, (int8_t)iImmAddend); 2563 2561 } 2564 2562 else 2565 2563 { 2566 /* mov dst, immadd */2567 2564 off = iemNativeEmitLoadGprImmEx(pCodeBuf, off, iGprDst, iImmAddend); 2568 /* add dst, gpradd */2569 2565 off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprAddend); 2570 2566 } 2571 2567 2572 2568 #elif defined(RT_ARCH_ARM64) 2573 uint 32_t const uAbsImmAddend = RT_ABS(iImmAddend);2569 uint64_t const uAbsImmAddend = RT_ABS(iImmAddend); 2574 2570 if (uAbsImmAddend < 4096) 2575 2571 { … … 2588 2584 else if (iGprDst != iGprAddend) 2589 2585 { 2590 off = iemNativeEmitLoadGprImmEx(pCodeBuf, off, iGprDst, (uint 32_t)iImmAddend);2586 off = iemNativeEmitLoadGprImmEx(pCodeBuf, off, iGprDst, (uint64_t)iImmAddend); 2591 2587 off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprAddend); 2592 2588 } … … 2621 2617 if ((int8_t)iImmAddend == iImmAddend) 2622 2618 { 2623 /* mov dst, gpradd */2624 2619 off = iemNativeEmitLoadGprFromGpr32Ex(pCodeBuf, off, iGprDst, iGprAddend); 2625 /* add dst, immadd */2626 2620 off = iemNativeEmitAddGpr32Imm8Ex(pCodeBuf, off, iGprDst, (int8_t)iImmAddend); 2627 2621 } 2628 2622 else 2629 2623 { 2630 /* mov dst, immadd */2631 2624 off = iemNativeEmitLoadGpr32ImmEx(pCodeBuf, off, iGprDst, iImmAddend); 2632 /* add dst, gpradd */2633 2625 off = iemNativeEmitAddTwoGprsEx(pCodeBuf, off, iGprDst, iGprAddend); 2634 2626 } … … 3055 3047 { 3056 3048 if (!fSetFlags) 3057 pCodeBuf[off++] = Armv8A64MkInstrAndImm(iGprDst, iGpr Dst, uImmNandS, uImmR, false /*f64Bit*/);3049 pCodeBuf[off++] = Armv8A64MkInstrAndImm(iGprDst, iGprSrc, uImmNandS, uImmR, false /*f64Bit*/); 3058 3050 else 3059 pCodeBuf[off++] = Armv8A64MkInstrAndsImm(iGprDst, iGpr Dst, uImmNandS, uImmR, false /*f64Bit*/);3051 pCodeBuf[off++] = Armv8A64MkInstrAndsImm(iGprDst, iGprSrc, uImmNandS, uImmR, false /*f64Bit*/); 3060 3052 } 3061 3053 else if (iGprDst != iGprSrc) … … 3924 3916 else 3925 3917 { 3926 Assert( (int64_t)(offLabel - off) <= -0x3ffff);3918 Assert(off - offLabel <= 0x3ffffU); 3927 3919 pCodeBuf[off++] = Armv8A64MkInstrBCond(enmCond, offLabel - off); 3928 3920 }
Note:
See TracChangeset
for help on using the changeset viewer.

