From 455a1847a32ef6006935c8cf7fc1d1c3bbe10f60 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Tue, 7 May 2024 20:25:32 +0300 Subject: [PATCH 1/7] Do stack spill; compiler optimizes it away --- stl/src/vector_algorithms.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index 69cb787e350..43ebdb34ec8 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -901,13 +901,11 @@ namespace { } static _Signed_t _Get_any(const __m128i _Cur) noexcept { -#ifdef _M_IX86 - return static_cast<_Signed_t>( - (static_cast<_Unsigned_t>(static_cast(_mm_extract_epi32(_Cur, 1))) << 32) - | static_cast<_Unsigned_t>(static_cast(_mm_cvtsi128_si32(_Cur)))); -#else // ^^^ x86 / x64 vvv - return static_cast<_Signed_t>(_mm_cvtsi128_si64(_Cur)); -#endif // ^^^ x64 ^^^ + // With optimizations enabled, compiles into registers movement, rather than actual stack spill. + // Works around _mm_cvtsi128_si64 absence on 32-bit + uint64_t _Tmp[4]; + _mm_storeu_si128(reinterpret_cast<__m128i*>(_Tmp), _Cur); + return _Tmp[0]; } static _Unsigned_t _Get_v_pos(const __m128i _Idx, const unsigned long _H_pos) noexcept { From 00dde4c7b029ca64d560c560c50ec16cf3ccc4d9 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Tue, 7 May 2024 20:43:59 +0300 Subject: [PATCH 2/7] Another occurrence! --- stl/src/vector_algorithms.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index 43ebdb34ec8..8bb60ecbc0e 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -1112,12 +1112,7 @@ namespace { } static uint64_t _Get_any_u(const __m128i _Cur) noexcept { -#ifdef _M_IX86 - return (static_cast(static_cast(_mm_extract_epi32(_Cur, 1))) << 32) - | static_cast(static_cast(_mm_cvtsi128_si32(_Cur))); -#else // ^^^ x86 / x64 vvv - return static_cast(_mm_cvtsi128_si64(_Cur)); -#endif // ^^^ x64 ^^^ + return _Minmax_traits_8::_Get_any(_Cur); } static uint64_t _Get_v_pos(const __m128i _Idx, const unsigned long _H_pos) noexcept { From b70258981928c440f61873fbb73c322b528262b9 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Tue, 7 May 2024 20:47:26 +0300 Subject: [PATCH 3/7] consume less stack (virtually) --- stl/src/vector_algorithms.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index 8bb60ecbc0e..7b8c21b12de 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -903,7 +903,7 @@ namespace { static _Signed_t _Get_any(const __m128i _Cur) noexcept { // With optimizations enabled, compiles into registers movement, rather than actual stack spill. // Works around _mm_cvtsi128_si64 absence on 32-bit - uint64_t _Tmp[4]; + uint64_t _Tmp[2]; _mm_storeu_si128(reinterpret_cast<__m128i*>(_Tmp), _Cur); return _Tmp[0]; } From a2798f698fae8e22821d083ebed17de1f913fe09 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 12 May 2024 15:32:50 -0700 Subject: [PATCH 4/7] Comment grammar. --- stl/src/vector_algorithms.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index 7b8c21b12de..4b8b0a5cbcc 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -901,8 +901,8 @@ namespace { } static _Signed_t _Get_any(const __m128i _Cur) noexcept { - // With optimizations enabled, compiles into registers movement, rather than actual stack spill. - // Works around _mm_cvtsi128_si64 absence on 32-bit + // With optimizations enabled, compiles into register movement, rather than an actual stack spill. + // Works around the absence of _mm_cvtsi128_si64 on 32-bit. uint64_t _Tmp[2]; _mm_storeu_si128(reinterpret_cast<__m128i*>(_Tmp), _Cur); return _Tmp[0]; From 5d85e7ef7a420303950bb336d14c64e95c0f505f Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 12 May 2024 15:55:40 -0700 Subject: [PATCH 5/7] `_Minmax_traits_8`: Implement `_Get_any` with `_Get_v_pos` and `static_cast`. --- stl/src/vector_algorithms.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index 4b8b0a5cbcc..770ea6473cf 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -903,9 +903,7 @@ namespace { static _Signed_t _Get_any(const __m128i _Cur) noexcept { // With optimizations enabled, compiles into register movement, rather than an actual stack spill. // Works around the absence of _mm_cvtsi128_si64 on 32-bit. - uint64_t _Tmp[2]; - _mm_storeu_si128(reinterpret_cast<__m128i*>(_Tmp), _Cur); - return _Tmp[0]; + return static_cast<_Signed_t>(_Get_v_pos(_Cur, 0)); } static _Unsigned_t _Get_v_pos(const __m128i _Idx, const unsigned long _H_pos) noexcept { From 39babc0e1a8f875a14a9806cad1120c6a95caf6d Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 12 May 2024 16:06:06 -0700 Subject: [PATCH 6/7] `_Minmax_traits_d::_Get_v_pos` is identical to `_Minmax_traits_8::_Get_v_pos`. --- stl/src/vector_algorithms.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index 770ea6473cf..f4813ee6b6b 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -1114,9 +1114,7 @@ namespace { } static uint64_t _Get_v_pos(const __m128i _Idx, const unsigned long _H_pos) noexcept { - uint64_t _Array[2]; - _mm_storeu_si128(reinterpret_cast<__m128i*>(&_Array), _Idx); - return _Array[_H_pos >> 3]; + return _Minmax_traits_8::_Get_v_pos(_Idx, _H_pos); } static __m128d _Cmp_eq(const __m128d _First, const __m128d _Second) noexcept { From 5563c6e1cd4e13acfc317cf99293db987bf66b0a Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 12 May 2024 16:13:13 -0700 Subject: [PATCH 7/7] `_Minmax_traits_d::_Get_any_u` can punch through to `_Minmax_traits_8::_Get_v_pos`. --- stl/src/vector_algorithms.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index f4813ee6b6b..3d17a0afc53 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -1110,7 +1110,7 @@ namespace { } static uint64_t _Get_any_u(const __m128i _Cur) noexcept { - return _Minmax_traits_8::_Get_any(_Cur); + return _Minmax_traits_8::_Get_v_pos(_Cur, 0); } static uint64_t _Get_v_pos(const __m128i _Idx, const unsigned long _H_pos) noexcept {