- Timestamp:
- Nov 13, 2023 12:57:44 PM (17 months ago)
- svn:sync-xref-src-repo-rev:
- 160193
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllN8vePython.py
r102080 r102082 92 92 'IEM_MC_STORE_GREG_U8_THREADED': (None, True, False, ), 93 93 'IEM_MC_STORE_GREG_U8_CONST_THREADED': (None, True, True, ), 94 'IEM_MC_FETCH_GREG_U8_THREADED': (None, False, False, ),94 'IEM_MC_FETCH_GREG_U8_THREADED': (None, False, True, ), 95 95 'IEM_MC_FETCH_GREG_U8_SX_U16_THREADED': (None, False, False, ), 96 96 'IEM_MC_FETCH_GREG_U8_SX_U32_THREADED': (None, False, False, ), … … 482 482 g_dUnsupportedMcStmtLastOneStats = {} 483 483 484 ## Statistics: List of variations (value) with aimpl_[^0] calls that is only missing this one statement (key).485 g_dUnsupportedMcStmtLastOneAImplStats = {}484 ### Statistics: List of variations (value) with aimpl_[^0] calls that is only missing this one statement (key). 485 #g_dUnsupportedMcStmtLastOneAImplStats = {} 486 486 487 487 … … 517 517 g_dUnsupportedMcStmtLastOneStats[sStmt] = [oVariation,]; 518 518 519 if ( len(dUnsupportedStmts) in (1,2)520 and iai.McStmt.findStmtByNames(aoStmts,521 { 'IEM_MC_CALL_AIMPL_3': 1,522 'IEM_MC_CALL_AIMPL_4': 1,523 #'IEM_MC_CALL_VOID_AIMPL_0': 1, - can't test results... ?524 'IEM_MC_CALL_VOID_AIMPL_1': 1,525 'IEM_MC_CALL_VOID_AIMPL_2': 1,526 'IEM_MC_CALL_VOID_AIMPL_3': 1,527 'IEM_MC_CALL_VOID_AIMPL_4': 1,528 #'IEM_MC_CALL_FPU_AIMPL_1': 1,529 #'IEM_MC_CALL_FPU_AIMPL_2': 1,530 #'IEM_MC_CALL_FPU_AIMPL_3': 1,531 #'IEM_MC_CALL_MMX_AIMPL_2': 1,532 #'IEM_MC_CALL_MMX_AIMPL_3': 1,533 #'IEM_MC_CALL_SSE_AIMPL_2': 1,534 #'IEM_MC_CALL_SSE_AIMPL_3': 1,535 #'IEM_MC_CALL_AVX_AIMPL_2': 1,536 #'IEM_MC_CALL_AVX_AIMPL_3': 1,537 #'IEM_MC_CALL_AVX_AIMPL_4': 1,538 })):539 for sStmt in dUnsupportedStmts:540 if sStmt in g_dUnsupportedMcStmtLastOneAImplStats:541 g_dUnsupportedMcStmtLastOneAImplStats[sStmt].append(oVariation);542 else:543 g_dUnsupportedMcStmtLastOneAImplStats[sStmt] = [oVariation,];519 #if ( len(dUnsupportedStmts) in (1,2) 520 # and iai.McStmt.findStmtByNames(aoStmts, 521 # { 'IEM_MC_CALL_AIMPL_3': 1, 522 # 'IEM_MC_CALL_AIMPL_4': 1, 523 # #'IEM_MC_CALL_VOID_AIMPL_0': 1, - can't test results... ? 524 # 'IEM_MC_CALL_VOID_AIMPL_1': 1, 525 # 'IEM_MC_CALL_VOID_AIMPL_2': 1, 526 # 'IEM_MC_CALL_VOID_AIMPL_3': 1, 527 # 'IEM_MC_CALL_VOID_AIMPL_4': 1, 528 # #'IEM_MC_CALL_FPU_AIMPL_1': 1, 529 # #'IEM_MC_CALL_FPU_AIMPL_2': 1, 530 # #'IEM_MC_CALL_FPU_AIMPL_3': 1, 531 # #'IEM_MC_CALL_MMX_AIMPL_2': 1, 532 # #'IEM_MC_CALL_MMX_AIMPL_3': 1, 533 # #'IEM_MC_CALL_SSE_AIMPL_2': 1, 534 # #'IEM_MC_CALL_SSE_AIMPL_3': 1, 535 # #'IEM_MC_CALL_AVX_AIMPL_2': 1, 536 # #'IEM_MC_CALL_AVX_AIMPL_3': 1, 537 # #'IEM_MC_CALL_AVX_AIMPL_4': 1, 538 # })): 539 # for sStmt in dUnsupportedStmts: 540 # if sStmt in g_dUnsupportedMcStmtLastOneAImplStats: 541 # g_dUnsupportedMcStmtLastOneAImplStats[sStmt].append(oVariation); 542 # else: 543 # g_dUnsupportedMcStmtLastOneAImplStats[sStmt] = [oVariation,]; 544 544 545 545 return None; … … 587 587 print('todo:', file = sys.stderr); 588 588 589 if g_dUnsupportedMcStmtLastOneAImplStats:590 asTopKeys = sorted(g_dUnsupportedMcStmtLastOneAImplStats, reverse = True,591 key = lambda sSortKey: len(g_dUnsupportedMcStmtLastOneAImplStats[sSortKey]))[:16];592 print('todo:', file = sys.stderr);593 print('todo: Top %s variations with AIMPL call and 1-2 unsupported statement dependencies:' % (len(asTopKeys),),594 file = sys.stderr);595 cchMaxKey = max([len(sKey) for sKey in asTopKeys]);596 for sKey in asTopKeys:597 print('todo: %*s = %s (%s%s)'598 % (cchMaxKey, sKey, len(g_dUnsupportedMcStmtLastOneAImplStats[sKey]),599 ', '.join([oVar.getShortName() for oVar in g_dUnsupportedMcStmtLastOneAImplStats[sKey][:5]]),600 ',...' if len(g_dUnsupportedMcStmtLastOneAImplStats[sKey]) >= 5 else '', )601 , file = sys.stderr);589 #if g_dUnsupportedMcStmtLastOneAImplStats: 590 # asTopKeys = sorted(g_dUnsupportedMcStmtLastOneAImplStats, reverse = True, 591 # key = lambda sSortKey: len(g_dUnsupportedMcStmtLastOneAImplStats[sSortKey]))[:16]; 592 # print('todo:', file = sys.stderr); 593 # print('todo: Top %s variations with AIMPL call and 1-2 unsupported statement dependencies:' % (len(asTopKeys),), 594 # file = sys.stderr); 595 # cchMaxKey = max([len(sKey) for sKey in asTopKeys]); 596 # for sKey in asTopKeys: 597 # print('todo: %*s = %s (%s%s)' 598 # % (cchMaxKey, sKey, len(g_dUnsupportedMcStmtLastOneAImplStats[sKey]), 599 # ', '.join([oVar.getShortName() for oVar in g_dUnsupportedMcStmtLastOneAImplStats[sKey][:5]]), 600 # ',...' if len(g_dUnsupportedMcStmtLastOneAImplStats[sKey]) >= 5 else '', ) 601 # , file = sys.stderr); 602 602 603 603 return True; -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp
r102080 r102082 6265 6265 *********************************************************************************************************************************/ 6266 6266 6267 #define IEM_MC_FETCH_GREG_U8_THREADED(a_u8Dst, a_iGRegEx) \ 6268 off = iemNativeEmitFetchGregU8(pReNative, off, a_u8Dst, a_iGRegEx) 6269 6270 /** Emits code for IEM_MC_FETCH_GREG_U8. */ 6271 DECL_INLINE_THROW(uint32_t) 6272 iemNativeEmitFetchGregU8(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxDstVar, uint8_t iGRegEx) 6273 { 6274 Assert(idxDstVar < RT_ELEMENTS(pReNative->Core.aVars) && (pReNative->Core.bmVars & RT_BIT_32(idxDstVar))); 6275 Assert(pReNative->Core.aVars[idxDstVar].cbVar == sizeof(uint8_t)); 6276 Assert(iGRegEx < 20); 6277 6278 /* Same discussion as in iemNativeEmitFetchGregU16 */ 6279 uint8_t const idxGstFullReg = iemNativeRegAllocTmpForGuestReg(pReNative, &off, IEMNATIVEGSTREG_GPR(iGRegEx & 15), 6280 kIemNativeGstRegUse_ReadOnly); 6281 6282 iemNativeVarSetKindToStack(pReNative, idxDstVar); 6283 uint8_t const idxVarReg = iemNativeVarAllocRegister(pReNative, idxDstVar, &off); 6284 6285 if (iGRegEx < 16) 6286 off = iemNativeEmitLoadGprFromGpr8(pReNative, off, idxVarReg, idxGstFullReg); 6287 else 6288 off = iemNativeEmitLoadGprFromGpr8Hi(pReNative, off, idxVarReg, idxGstFullReg); 6289 6290 iemNativeRegFreeTmp(pReNative, idxGstFullReg); 6291 return off; 6292 } 6293 6294 6267 6295 #define IEM_MC_FETCH_GREG_U16(a_u16Dst, a_iGReg) \ 6268 6296 off = iemNativeEmitFetchGregU16(pReNative, off, a_u16Dst, a_iGReg) … … 6274 6302 Assert(idxDstVar < RT_ELEMENTS(pReNative->Core.aVars) && (pReNative->Core.bmVars & RT_BIT_32(idxDstVar))); 6275 6303 Assert(pReNative->Core.aVars[idxDstVar].cbVar == sizeof(uint16_t)); 6304 Assert(iGReg < 16); 6276 6305 6277 6306 /* … … 6303 6332 Assert(idxDstVar < RT_ELEMENTS(pReNative->Core.aVars) && (pReNative->Core.bmVars & RT_BIT_32(idxDstVar))); 6304 6333 Assert(pReNative->Core.aVars[idxDstVar].cbVar == sizeof(uint32_t)); 6334 Assert(iGReg < 16); 6305 6335 6306 6336 /* -
trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h
r102068 r102082 662 662 /* movzx Gv,Eb */ 663 663 uint8_t * const pbCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 4); 664 if ( (iGprDst | iGprSrc)>= 8)664 if (iGprDst >= 8 || iGprSrc >= 8) 665 665 pbCodeBuf[off++] = iGprDst < 8 ? X86_OP_REX_B 666 666 : iGprSrc >= 8 ? X86_OP_REX_R | X86_OP_REX_B 667 667 : X86_OP_REX_R; 668 else if (iGprSrc >= 4) 669 pbCodeBuf[off++] = X86_OP_REX; 668 670 pbCodeBuf[off++] = 0x0f; 669 671 pbCodeBuf[off++] = 0xb6; … … 688 690 } 689 691 690 #if 0 /** @todo */ 692 691 693 /** 692 694 * Emits a gprdst = gprsrc[15:8] load (ah, ch, dh, bh). … … 694 696 */ 695 697 DECL_INLINE_THROW(uint32_t) 696 iemNativeEmitLoadGprFromGpr8 hi(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t iGprDst, uint8_t iGprSrc)697 { 698 #ifdef RT_ARCH_AMD64 699 /* movzx Gv,Eb */700 /** @todo */ 701 uint8_t * const pbCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 4);698 iemNativeEmitLoadGprFromGpr8Hi(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t iGprDst, uint8_t iGprSrc) 699 { 700 #ifdef RT_ARCH_AMD64 701 uint8_t * const pbCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 8); 702 703 /* movzx Gv,Ew */ 702 704 if ((iGprDst | iGprSrc) >= 8) 703 705 pbCodeBuf[off++] = iGprDst < 8 ? X86_OP_REX_B … … 705 707 : X86_OP_REX_R; 706 708 pbCodeBuf[off++] = 0x0f; 707 pbCodeBuf[off++] = 0xb 6;709 pbCodeBuf[off++] = 0xb7; 708 710 pbCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, iGprDst & 7, iGprSrc & 7); 709 711 712 /* shr Ev,8 */ 713 if (iGprDst >= 8) 714 pbCodeBuf[off++] = X86_OP_REX_B; 715 pbCodeBuf[off++] = 0xc1; 716 pbCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, 5, iGprDst & 7); 717 pbCodeBuf[off++] = 8; 718 710 719 #elif RT_ARCH_ARM64 711 /* ubfxgprdst, gprsrc, #8, #8 */720 /* bfi gprdst, gprsrc, #8, #8 */ 712 721 uint32_t * const pu32CodeBuf = iemNativeInstrBufEnsure(pReNative, off, 1); 713 Assert(Armv8A64ConvertImmRImmS2Mask64(0x47, 0) == UINT8_MAX); 714 pu32CodeBuf[off++] = /** @todo ubfx */; 722 pu32CodeBuf[off++] = Armv8A64MkInstrBfi(iGprDst, iGprSrc, 8, 8, false /*f64Bit*/); 715 723 716 724 #else … … 720 728 return off; 721 729 } 722 #endif 730 723 731 724 732 #ifdef RT_ARCH_AMD64
Note:
See TracChangeset
for help on using the changeset viewer.