VirtualBox

Changeset 103768 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Mar 11, 2024 2:39:16 PM (9 months ago)
Author:
vboxsync
Message:

VMM/IEM: Some more threaded function name annotating to make the native recompilation state more visible in the statistics. bugref:10376

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r103756 r103768  
    659659
    660660
    661 def displayStatistics(aoThreadedFuncs, sHostArch): # type (list(ThreadedFunction)) -> True
     661def analyzeThreadedFunctionsForNativeRecomp(aoThreadedFuncs, sHostArch): # type (list(ThreadedFunction)) -> True
    662662    """
    663663    Displays statistics.
     
    667667    cNative = 0;
    668668    for oThreadedFunction in aoThreadedFuncs:
     669        cNativeVariations = 0;
    669670        for oVariation in oThreadedFunction.aoVariations:
    670671            cTotal += 1;
    671672            oVariation.oNativeRecomp = analyzeVariantForNativeRecomp(oVariation, sHostArch);
    672673            if oVariation.oNativeRecomp and oVariation.oNativeRecomp.isRecompilable():
    673                 cNative += 1;
     674                cNativeVariations += 1;
     675        cNative += cNativeVariations;
     676
     677        # If all variations can be recompiled natively, annotate the threaded
     678        # function name accordingly so it'll be easy to spot in the stats.
     679        if oThreadedFunction.sSubName:
     680            if cNativeVariations == len(oThreadedFunction.aoVariations):
     681                aoStmts = oThreadedFunction.oMcBlock.decode();
     682                oStmt = iai.McStmt.findStmtByNames(aoStmts, {'IEM_MC_NATIVE_IF': True,});
     683                if oStmt and NativeRecompFunctionVariation.kdOptionArchToVal[sHostArch] in oStmt.asArchitectures:
     684                    oThreadedFunction.sSubName += '_ne';        # native emit
     685                elif oThreadedFunction.sSubName.find('aimpl') >= 0:
     686                    oThreadedFunction.sSubName += '_na';        # native aimpl
     687                else:
     688                    oThreadedFunction.sSubName += '_nn';        # native native
     689            elif cNativeVariations == 0:
     690                oThreadedFunction.sSubName += '_ntodo';         # native threaded todo
     691            else:
     692                oThreadedFunction.sSubName += '_nm';            # native mixed
     693
     694
    674695    print('todo: %.1f%% / %u out of %u threaded function variations are recompilable'
    675696          % (cNative * 100.0 / cTotal, cNative, cTotal), file = sys.stderr);
  • trunk/src/VBox/VMM/VMMAll/IEMAllThrdPython.py

    r103757 r103768  
    15641564        self.dsCImplFlags   = {}            # type: Dict[str, bool]
    15651565        ## The unique sub-name for this threaded function.
    1566         self.sSubName  = '';
     1566        self.sSubName       = '';
    15671567        #if oMcBlock.iInFunction > 0 or (oMcBlock.oInstruction and len(oMcBlock.oInstruction.aoMcBlocks) > 1):
    15681568        #    self.sSubName  = '_%s' % (oMcBlock.iInFunction);
     
    18351835        'IEM_MC_MERGE_YREG_U64LOCAL_U64HI_ZX_VLMAX':'__yreg64',
    18361836    };
     1837    kdAnnotateNameCallStmts = {
     1838        'IEM_MC_CALL_CIMPL_0':                      '__cimpl',
     1839        'IEM_MC_CALL_CIMPL_1':                      '__cimpl',
     1840        'IEM_MC_CALL_CIMPL_2':                      '__cimpl',
     1841        'IEM_MC_CALL_CIMPL_3':                      '__cimpl',
     1842        'IEM_MC_CALL_CIMPL_4':                      '__cimpl',
     1843        'IEM_MC_CALL_CIMPL_5':                      '__cimpl',
     1844        'IEM_MC_CALL_CIMPL_6':                      '__cimpl',
     1845        'IEM_MC_CALL_CIMPL_7':                      '__cimpl',
     1846        'IEM_MC_DEFER_TO_CIMPL_0_RET':              '__cimpl_defer',
     1847        'IEM_MC_DEFER_TO_CIMPL_1_RET':              '__cimpl_defer',
     1848        'IEM_MC_DEFER_TO_CIMPL_2_RET':              '__cimpl_defer',
     1849        'IEM_MC_DEFER_TO_CIMPL_3_RET':              '__cimpl_defer',
     1850        'IEM_MC_DEFER_TO_CIMPL_4_RET':              '__cimpl_defer',
     1851        'IEM_MC_DEFER_TO_CIMPL_5_RET':              '__cimpl_defer',
     1852        'IEM_MC_DEFER_TO_CIMPL_6_RET':              '__cimpl_defer',
     1853        'IEM_MC_DEFER_TO_CIMPL_7_RET':              '__cimpl_defer',
     1854        'IEM_MC_CALL_VOID_AIMPL_0':                 '__aimpl',
     1855        'IEM_MC_CALL_VOID_AIMPL_1':                 '__aimpl',
     1856        'IEM_MC_CALL_VOID_AIMPL_2':                 '__aimpl',
     1857        'IEM_MC_CALL_VOID_AIMPL_3':                 '__aimpl',
     1858        'IEM_MC_CALL_VOID_AIMPL_4':                 '__aimpl',
     1859        'IEM_MC_CALL_VOID_AIMPL_5':                 '__aimpl',
     1860        'IEM_MC_CALL_AIMPL_0':                      '__aimpl_ret',
     1861        'IEM_MC_CALL_AIMPL_1':                      '__aimpl_ret',
     1862        'IEM_MC_CALL_AIMPL_2':                      '__aimpl_ret',
     1863        'IEM_MC_CALL_AIMPL_3':                      '__aimpl_ret',
     1864        'IEM_MC_CALL_AIMPL_4':                      '__aimpl_ret',
     1865        'IEM_MC_CALL_AIMPL_5':                      '__aimpl_ret',
     1866        'IEM_MC_CALL_AIMPL_6':                      '__aimpl_ret',
     1867        'IEM_MC_CALL_VOID_AIMPL_6':                 '__aimpl_fpu',
     1868        'IEM_MC_CALL_FPU_AIMPL_0':                  '__aimpl_fpu',
     1869        'IEM_MC_CALL_FPU_AIMPL_1':                  '__aimpl_fpu',
     1870        'IEM_MC_CALL_FPU_AIMPL_2':                  '__aimpl_fpu',
     1871        'IEM_MC_CALL_FPU_AIMPL_3':                  '__aimpl_fpu',
     1872        'IEM_MC_CALL_FPU_AIMPL_4':                  '__aimpl_fpu',
     1873        'IEM_MC_CALL_FPU_AIMPL_5':                  '__aimpl_fpu',
     1874        'IEM_MC_CALL_MMX_AIMPL_0':                  '__aimpl_mmx',
     1875        'IEM_MC_CALL_MMX_AIMPL_1':                  '__aimpl_mmx',
     1876        'IEM_MC_CALL_MMX_AIMPL_2':                  '__aimpl_mmx',
     1877        'IEM_MC_CALL_MMX_AIMPL_3':                  '__aimpl_mmx',
     1878        'IEM_MC_CALL_MMX_AIMPL_4':                  '__aimpl_mmx',
     1879        'IEM_MC_CALL_MMX_AIMPL_5':                  '__aimpl_mmx',
     1880        'IEM_MC_CALL_SSE_AIMPL_0':                  '__aimpl_sse',
     1881        'IEM_MC_CALL_SSE_AIMPL_1':                  '__aimpl_sse',
     1882        'IEM_MC_CALL_SSE_AIMPL_2':                  '__aimpl_sse',
     1883        'IEM_MC_CALL_SSE_AIMPL_3':                  '__aimpl_sse',
     1884        'IEM_MC_CALL_SSE_AIMPL_4':                  '__aimpl_sse',
     1885        'IEM_MC_CALL_SSE_AIMPL_5':                  '__aimpl_sse',
     1886        'IEM_MC_CALL_AVX_AIMPL_0':                  '__aimpl_avx',
     1887        'IEM_MC_CALL_AVX_AIMPL_1':                  '__aimpl_avx',
     1888        'IEM_MC_CALL_AVX_AIMPL_2':                  '__aimpl_avx',
     1889        'IEM_MC_CALL_AVX_AIMPL_3':                  '__aimpl_avx',
     1890        'IEM_MC_CALL_AVX_AIMPL_4':                  '__aimpl_avx',
     1891        'IEM_MC_CALL_AVX_AIMPL_5':                  '__aimpl_avx',
     1892    };
    18371893    def analyzeAndAnnotateName(self, aoStmts: List[iai.McStmt]):
    18381894        """
     
    18401896        and sets self.sSubName if successfull.
    18411897        """
     1898        # Operand base naming:
    18421899        dHits = {};
    18431900        cHits = iai.McStmt.countStmtsByName(aoStmts, self.kdAnnotateNameMemStmts, dHits);
     
    18471904        else:
    18481905            cHits = iai.McStmt.countStmtsByName(aoStmts, self.kdAnnotateNameRegStmts, dHits);
    1849             if not cHits:
     1906            if cHits > 0:
     1907                sStmtNm = sorted(dHits.keys())[-1]; # priority: STORE, MEM_MAP, FETCH.
     1908                sName = self.kdAnnotateNameRegStmts[sStmtNm];
     1909            else:
     1910                # No op details, try name it by call type...
     1911                cHits = iai.McStmt.countStmtsByName(aoStmts, self.kdAnnotateNameCallStmts, dHits);
     1912                if cHits > 0:
     1913                    sStmtNm = sorted(dHits.keys())[-1]; # Not really necessary to sort, but simple this way.
     1914                    self.sSubName = self.kdAnnotateNameCallStmts[sStmtNm];
    18501915                return;
    1851             sStmtNm = sorted(dHits.keys())[-1]; # priority: STORE, MEM_MAP, FETCH.
    1852             sName = self.kdAnnotateNameRegStmts[sStmtNm];
    1853 
    1854         oStmt = iai.McStmt.findStmtByNames(aoStmts, {'IEM_MC_NATIVE_IF': True,});
    1855         if oStmt and oStmt.asArchitectures:
    1856             sName += '_n'; ## @todo check if enabled for the host architecture
     1916
     1917        # Add call info if any:
     1918        dHits = {};
     1919        cHits = iai.McStmt.countStmtsByName(aoStmts, self.kdAnnotateNameCallStmts, dHits);
     1920        if cHits > 0:
     1921            sStmtNm = sorted(dHits.keys())[-1]; # Not really necessary to sort, but simple this way.
     1922            sName += self.kdAnnotateNameCallStmts[sStmtNm][1:];
     1923
    18571924        self.sSubName = sName;
    18581925        return;
     
    19492016        return sAnnotation;
    19502017
    1951     def analyze(self, oGenerator):
     2018    def analyzeThreadedFunction(self, oGenerator):
    19522019        """
    19532020        Analyzes the code, identifying the number of parameters it requires and such.
     
    25422609        dMinParamCounts = {};
    25432610        for oThreadedFunction in self.aoThreadedFuncs:
    2544             oThreadedFunction.analyze(self);
     2611            oThreadedFunction.analyzeThreadedFunction(self);
    25452612            for oVariation in oThreadedFunction.aoVariations:
    25462613                dRawParamCounts[len(oVariation.dParamRefs)] = dRawParamCounts.get(len(oVariation.dParamRefs), 0) + 1;
     
    25842651        # Analyze the threaded functions and their variations for native recompilation.
    25852652        if fNativeRecompilerEnabled:
    2586             ian.displayStatistics(self.aoThreadedFuncs, sHostArch);
     2653            ian.analyzeThreadedFunctionsForNativeRecomp(self.aoThreadedFuncs, sHostArch);
    25872654
    25882655        # Gather arguments + variable statistics for the MC blocks.
Note: See TracChangeset for help on using the changeset viewer.

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