VirtualBox

Changeset 102082 in vbox for trunk


Ignore:
Timestamp:
Nov 13, 2023 12:57:44 PM (17 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
160193
Message:

VMM/IEM: Native translation of IEM_MC_FETCH_GREG_U8_THREADED. bugref:10371

Location:
trunk/src/VBox/VMM
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8vePython.py

    r102080 r102082  
    9292    'IEM_MC_STORE_GREG_U8_THREADED':                             (None, True,  False, ),
    9393    '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, ),
    9595    'IEM_MC_FETCH_GREG_U8_SX_U16_THREADED':                      (None, False, False, ),
    9696    'IEM_MC_FETCH_GREG_U8_SX_U32_THREADED':                      (None, False, False, ),
     
    482482g_dUnsupportedMcStmtLastOneStats = {}
    483483
    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 = {}
    486486
    487487
     
    517517                g_dUnsupportedMcStmtLastOneStats[sStmt] = [oVariation,];
    518518
    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,];
    544544
    545545    return None;
     
    587587        print('todo:', file = sys.stderr);
    588588
    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);
    602602
    603603    return True;
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp

    r102080 r102082  
    62656265*********************************************************************************************************************************/
    62666266
     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. */
     6271DECL_INLINE_THROW(uint32_t)
     6272iemNativeEmitFetchGregU8(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
    62676295#define IEM_MC_FETCH_GREG_U16(a_u16Dst, a_iGReg) \
    62686296    off = iemNativeEmitFetchGregU16(pReNative, off, a_u16Dst, a_iGReg)
     
    62746302    Assert(idxDstVar < RT_ELEMENTS(pReNative->Core.aVars) && (pReNative->Core.bmVars & RT_BIT_32(idxDstVar)));
    62756303    Assert(pReNative->Core.aVars[idxDstVar].cbVar == sizeof(uint16_t));
     6304    Assert(iGReg < 16);
    62766305
    62776306    /*
     
    63036332    Assert(idxDstVar < RT_ELEMENTS(pReNative->Core.aVars) && (pReNative->Core.bmVars & RT_BIT_32(idxDstVar)));
    63046333    Assert(pReNative->Core.aVars[idxDstVar].cbVar == sizeof(uint32_t));
     6334    Assert(iGReg < 16);
    63056335
    63066336    /*
  • trunk/src/VBox/VMM/include/IEMN8veRecompilerEmit.h

    r102068 r102082  
    662662    /* movzx Gv,Eb */
    663663    uint8_t * const pbCodeBuf = iemNativeInstrBufEnsure(pReNative, off, 4);
    664     if ((iGprDst | iGprSrc) >= 8)
     664    if (iGprDst >= 8 || iGprSrc >= 8)
    665665        pbCodeBuf[off++] = iGprDst < 8  ? X86_OP_REX_B
    666666                         : iGprSrc >= 8 ? X86_OP_REX_R | X86_OP_REX_B
    667667                         :                X86_OP_REX_R;
     668    else if (iGprSrc >= 4)
     669        pbCodeBuf[off++] = X86_OP_REX;
    668670    pbCodeBuf[off++] = 0x0f;
    669671    pbCodeBuf[off++] = 0xb6;
     
    688690}
    689691
    690 #if 0 /** @todo */
     692
    691693/**
    692694 * Emits a gprdst = gprsrc[15:8] load (ah, ch, dh, bh).
     
    694696 */
    695697DECL_INLINE_THROW(uint32_t)
    696 iemNativeEmitLoadGprFromGpr8hi(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);
     698iemNativeEmitLoadGprFromGpr8Hi(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 */
    702704    if ((iGprDst | iGprSrc) >= 8)
    703705        pbCodeBuf[off++] = iGprDst < 8  ? X86_OP_REX_B
     
    705707                         :                X86_OP_REX_R;
    706708    pbCodeBuf[off++] = 0x0f;
    707     pbCodeBuf[off++] = 0xb6;
     709    pbCodeBuf[off++] = 0xb7;
    708710    pbCodeBuf[off++] = X86_MODRM_MAKE(X86_MOD_REG, iGprDst & 7, iGprSrc & 7);
    709711
     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
    710719#elif RT_ARCH_ARM64
    711     /* ubfx gprdst, gprsrc, #8, #8 */
     720    /* bfi gprdst, gprsrc, #8, #8 */
    712721    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*/);
    715723
    716724#else
     
    720728    return off;
    721729}
    722 #endif
     730
    723731
    724732#ifdef RT_ARCH_AMD64
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette