- Timestamp:
- Nov 28, 2023 2:24:49 PM (15 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllInstPython.py
r102350 r102368 2907 2907 'IEM_MC_FETCH_MEM_U128_AND_XREG_U128_AND_EAX_EDX_U32_SX_U64':(McBlock.parseMcGeneric, True, False, ), 2908 2908 'IEM_MC_FETCH_MEM_U16': (McBlock.parseMcGeneric, True, True, ), 2909 'IEM_MC_FETCH_MEM_U16_DISP': (McBlock.parseMcGeneric, True, False,),2909 'IEM_MC_FETCH_MEM_U16_DISP': (McBlock.parseMcGeneric, True, True, ), 2910 2910 'IEM_MC_FETCH_MEM_U16_SX_U32': (McBlock.parseMcGeneric, True, False, ), 2911 2911 'IEM_MC_FETCH_MEM_U16_SX_U64': (McBlock.parseMcGeneric, True, False, ), … … 2916 2916 'IEM_MC_FETCH_MEM_U256_NO_AC': (McBlock.parseMcGeneric, True, False, ), 2917 2917 'IEM_MC_FETCH_MEM_U32': (McBlock.parseMcGeneric, True, True, ), 2918 'IEM_MC_FETCH_MEM_U32_DISP': (McBlock.parseMcGeneric, True, False, ), 2918 'IEM_MC_FETCH_MEM_U32_DISP': (McBlock.parseMcGeneric, True, False, ), #bounds only 2919 2919 'IEM_MC_FETCH_MEM_U32_SX_U64': (McBlock.parseMcGeneric, True, False, ), 2920 2920 'IEM_MC_FETCH_MEM_U32_ZX_U64': (McBlock.parseMcGeneric, True, False, ), -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp
r102351 r102368 7547 7547 7548 7548 7549 #define IEM_MC_FETCH_MEM_U16_DISP(a_u16Dst, a_iSeg, a_GCPtrMem, a_offDisp) \ 7550 off = iemNativeEmitMemFetchDataCommon(pReNative, off, pCallEntry->idxInstr, a_u16Dst, a_iSeg, a_GCPtrMem, sizeof(uint16_t), a_offDisp) 7551 7552 #define IEM_MC_FETCH_MEM_U32_DISP(a_u32Dst, a_iSeg, a_GCPtrMem, a_offDisp) \ 7553 off = iemNativeEmitMemFetchDataCommon(pReNative, off, pCallEntry->idxInstr, a_u32Dst, a_iSeg, a_GCPtrMem, sizeof(uint32_t), a_offDisp) 7554 7555 7549 7556 /** Emits code for IEM_MC_FETCH_MEM_U8/16/32/64 and 7550 7557 * IEM_MC_FETCH_MEM_FLAT_U8/16/32/64 (iSegReg = UINT8_MAX). */ 7551 7558 DECL_INLINE_THROW(uint32_t) 7552 7559 iemNativeEmitMemFetchDataCommon(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxInstr, 7553 uint8_t idxVarDst, uint8_t iSegReg, uint8_t idxVarGCPtrMem, uint8_t cbMem )7560 uint8_t idxVarDst, uint8_t iSegReg, uint8_t idxVarGCPtrMem, uint8_t cbMem, uint8_t offDisp = 0) 7554 7561 { 7555 7562 IEMNATIVE_ASSERT_VAR_IDX(pReNative, idxVarDst); … … 7655 7662 7656 7663 if (pReNative->Core.aVars[idxVarGCPtrMem].enmKind == kIemNativeVarKind_Immediate) 7657 off = iemNativeEmitLoadGprImm64(pReNative, off, idxRegArgGCPtrMem, pReNative->Core.aVars[idxVarGCPtrMem].u.uValue); 7664 off = iemNativeEmitLoadGprImm64(pReNative, off, idxRegArgGCPtrMem, 7665 pReNative->Core.aVars[idxVarGCPtrMem].u.uValue + offDisp); 7658 7666 else 7659 7667 { … … 7662 7670 { 7663 7671 Assert(!(RT_BIT_32(idxRegVarGCPtrMem) & IEMNATIVE_CALL_VOLATILE_GREG_MASK)); 7664 off = iemNativeEmitLoadGprFromGpr(pReNative, off, idxRegArgGCPtrMem, idxRegVarGCPtrMem); 7672 if (!offDisp) 7673 off = iemNativeEmitLoadGprFromGpr(pReNative, off, idxRegArgGCPtrMem, idxRegVarGCPtrMem); 7674 else 7675 off = iemNativeEmitLoadGprFromGprWithAddend(pReNative, off, idxRegArgGCPtrMem, idxRegVarGCPtrMem, offDisp); 7665 7676 } 7666 7677 else … … 7668 7679 AssertFailed(); /** @todo This was probably caused by iemNativeRegMoveAndFreeAndFlushAtCall above. Improve... */ 7669 7680 off = iemNativeEmitLoadGprByBp(pReNative, off, idxRegArgGCPtrMem, iemNativeVarCalcBpDisp(pReNative, idxVarGCPtrMem)); 7681 if (offDisp) 7682 off = iemNativeEmitAddGprImm(pReNative, off, idxRegArgGCPtrMem, offDisp); 7670 7683 } 7671 7684 } -
trunk/src/VBox/VMM/include/IEMN8veRecompiler.h
r102313 r102368 254 254 255 255 /** This is the maximum argument count we'll ever be needing. */ 256 #define IEMNATIVE_CALL_MAX_ARG_COUNT 7 256 #if defined(RT_OS_WINDOWS) && defined(VBOXSTRICTRC_STRICT_ENABLED) 257 # define IEMNATIVE_CALL_MAX_ARG_COUNT 8 258 #else 259 # define IEMNATIVE_CALL_MAX_ARG_COUNT 7 260 #endif 257 261 /** @} */ 258 262 -
trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h
r102082 r102368 721 721 uint32_t * const pu32CodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1); 722 722 pu32CodeBuf[off++] = Armv8A64MkInstrBfi(iGprDst, iGprSrc, 8, 8, false /*f64Bit*/); 723 724 #else 725 # error "port me" 726 #endif 727 IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off); 728 return off; 729 } 730 731 732 /** 733 * Emits a gprdst = gprsrc + addend load. 734 */ 735 DECL_INLINE_THROW(uint32_t) 736 iemNativeEmitLoadGprFromGprWithAddend(PIEMRECOMPILERSTATE pReNative, uint32_t off, 737 uint8_t iGprDst, uint8_t iGprSrc, int32_t iAddend) 738 { 739 Assert(iAddend != 0); 740 741 #ifdef RT_ARCH_AMD64 742 /* lea gprdst, [gprsrc + iAddend] */ 743 uint8_t * const pbCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 7); 744 if ((iGprDst | iGprSrc) >= 8) 745 pbCodeBuf[off++] = iGprDst < 8 ? X86_OP_REX_W | X86_OP_REX_B 746 : iGprSrc >= 8 ? X86_OP_REX_W | X86_OP_REX_R | X86_OP_REX_B 747 : X86_OP_REX_W | X86_OP_REX_R; 748 else 749 pbCodeBuf[off++] = X86_OP_REX_W; 750 pbCodeBuf[off++] = 0x8d; 751 if (iAddend >= -128 && iAddend < 128) 752 { 753 pbCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_MEM1, iGprDst & 7, iGprSrc & 7); 754 pbCodeBuf[off++] = (int8_t)iAddend; 755 } 756 else 757 { 758 pbCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_MEM4, iGprDst & 7, iGprSrc & 7); 759 pbCodeBuf[off++] = RT_BYTE1((uint32_t)iAddend); 760 pbCodeBuf[off++] = RT_BYTE2((uint32_t)iAddend); 761 pbCodeBuf[off++] = RT_BYTE3((uint32_t)iAddend); 762 pbCodeBuf[off++] = RT_BYTE4((uint32_t)iAddend); 763 } 764 765 #elif RT_ARCH_ARM64 766 if ((uint32_t)iAddend < 4096) 767 { 768 /* add dst, src, uimm12 */ 769 uint32_t * const pu32CodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1); 770 pu32CodeBuf[off++] = Armv8A64MkInstrAddSubUImm12(false /*fSub*/, iGprDst, iGprSrc, (uint32_t)iAddend); 771 } 772 else if ((uint32_t)-iAddend < 4096) 773 { 774 /* sub dst, src, uimm12 */ 775 uint32_t * const pu32CodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1); 776 pu32CodeBuf[off++] = Armv8A64MkInstrAddSubUImm12(true /*fSub*/, iGprDst, iGprSrc, (uint32_t)-iAddend); 777 } 778 else 779 { 780 off = iemNativeEmitLoadGprImm64(pReNative, off, iGrpDst, (int64)iAddend); 781 uint32_t * const pu32CodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1); 782 pu32CodeBuf[off++] = Armv8A64MkInstrAddSubReg(false /*fSub*/, iGprDst, iGprSrc, iGprDst); 783 } 723 784 724 785 #else
Note:
See TracChangeset
for help on using the changeset viewer.