diff options
Diffstat (limited to '3rdparty/asmjit/test/asmjit_test_perf.h')
-rw-r--r-- | 3rdparty/asmjit/test/asmjit_test_perf.h | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/3rdparty/asmjit/test/asmjit_test_perf.h b/3rdparty/asmjit/test/asmjit_test_perf.h index 2ab0038ed31..f637013985b 100644 --- a/3rdparty/asmjit/test/asmjit_test_perf.h +++ b/3rdparty/asmjit/test/asmjit_test_perf.h @@ -10,7 +10,9 @@ #include "asmjitutils.h" #include "performancetimer.h" -class MyErrorHandler : public asmjit::ErrorHandler { +namespace asmjit_perf_utils { + +class TestErrorHandler : public asmjit::ErrorHandler { void handleError(asmjit::Error err, const char* message, asmjit::BaseEmitter* origin) { (void)err; (void)origin; @@ -19,10 +21,50 @@ class MyErrorHandler : public asmjit::ErrorHandler { } }; +#ifndef ASMJIT_NO_BUILDER +template<typename BuilderT, typename FuncT> +static uint32_t calculateInstructionCount(asmjit::CodeHolder& code, asmjit::Arch arch, const FuncT& func) noexcept { + BuilderT builder; + TestErrorHandler eh; + + asmjit::Environment env(arch); + code.init(env); + code.setErrorHandler(&eh); + code.attach(&builder); + func(builder); + + uint32_t count = 0; + asmjit::BaseNode* node = builder.firstNode(); + + while (node) { + count += uint32_t(node->isInst()); + node = node->next(); + } + + code.reset(); + return count; +} +#endif + +static inline double calculateMBPS(double duration, uint64_t outputSize) noexcept { + if (duration == 0) + return 0.0; + + double bytesTotal = double(outputSize); + return (bytesTotal * 1000) / (duration * 1024 * 1024); +} + +static inline double calculateMIPS(double duration, uint64_t instCount) noexcept { + if (duration == 0) + return 0.0; + + return double(instCount) * 1000.0 / (duration * 1e6); +} + template<typename EmitterT, typename FuncT> -static void bench(asmjit::CodeHolder& code, asmjit::Arch arch, uint32_t numIterations, const char* testName, const FuncT& func) noexcept { +static void bench(asmjit::CodeHolder& code, asmjit::Arch arch, uint32_t numIterations, const char* testName, uint32_t instCount, const FuncT& func) noexcept { EmitterT emitter; - MyErrorHandler eh; + TestErrorHandler eh; const char* archName = asmjitArchAsString(arch); const char* emitterName = @@ -53,9 +95,20 @@ static void bench(asmjit::CodeHolder& code, asmjit::Arch arch, uint32_t numItera } printf(" [%s] %-9s %-16s | CodeSize:%5llu [B] | Time:%8.4f [ms]", archName, emitterName, testName, (unsigned long long)codeSize, duration); - if (codeSize) - printf(" | Speed:%8.3f [MB/s]", mbps(duration, codeSize)); + if (codeSize) { + printf(" | Speed:%7.1f [MiB/s]", calculateMBPS(duration, codeSize)); + } + else { + printf(" | Speed: N/A "); + } + + if (instCount) { + printf(", %8.1f [MInst/s]", calculateMIPS(duration, instCount)); + } + printf("\n"); } +} // {asmjit_perf_utils} + #endif // ASMJIT_TEST_PERF_H_INCLUDED |