From 2670a3af3ade7ad292e831106539bac2e202d860 Mon Sep 17 00:00:00 2001 From: statementreply Date: Fri, 7 Nov 2025 22:22:24 +0800 Subject: [PATCH] Optimize 24 MHz to nanoseconds conversion --- stl/inc/__msvc_chrono.hpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/stl/inc/__msvc_chrono.hpp b/stl/inc/__msvc_chrono.hpp index 3f92cd0de52..094f700699d 100644 --- a/stl/inc/__msvc_chrono.hpp +++ b/stl/inc/__msvc_chrono.hpp @@ -677,8 +677,14 @@ namespace chrono { return time_point(duration(_Ctr * _Multiplier)); } else if (_Freq == _TwentyFourMHz) { // 24 MHz is a common frequency on ARM64, including cases where it emulates x86/x64. - const long long _Whole = (_Ctr / _TwentyFourMHz) * period::den; - const long long _Part = (_Ctr % _TwentyFourMHz) * period::den / _TwentyFourMHz; + constexpr long long _Multiplier_whole = period::den / _TwentyFourMHz; + using _Multiplier_part = ratio; + constexpr long long _Multiplier_num = _Multiplier_part::num; + constexpr long long _Multiplier_den = _Multiplier_part::den; + static_assert( + _Multiplier_num <= _Multiplier_whole, "This assumes that _Ctr * _Multiplier_num doesn't overflow."); + const long long _Whole = _Ctr * _Multiplier_whole; + const long long _Part = _Ctr * _Multiplier_num / _Multiplier_den; return time_point(duration(_Whole + _Part)); } else { // Instead of just having "(_Ctr * period::den) / _Freq",