This reduces the latency until conditional jump as the result of a comparison can now directly be used by a test instruction.
Signed-off-by: Matthias Kretz <[email protected]> libstdc++-v3/ChangeLog: * include/bits/simd_mask.h (_M_all_of, _M_any_of, _M_none_of): Call appropriate ktest builtin. --- libstdc++-v3/include/bits/simd_mask.h | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/libstdc++-v3/include/bits/simd_mask.h b/libstdc++-v3/include/ bits/simd_mask.h index 78979e4a3431..1bf74e5ae599 100644 --- a/libstdc++-v3/include/bits/simd_mask.h +++ b/libstdc++-v3/include/bits/simd_mask.h @@ -1211,6 +1211,19 @@ _M_all_of() const noexcept return _M_data; else if constexpr (_S_use_bitmask) { +#if _GLIBCXX_X86 + if (!__is_const_known(_M_data)) + { + if constexpr (sizeof(_M_data) == 1) + return 1 == __builtin_ia32_ktestcqi(_M_data, _S_implicit_mask); + else if constexpr (sizeof(_M_data) == 2) + return 1 == __builtin_ia32_ktestchi(_M_data, _S_implicit_mask); + else if constexpr (sizeof(_M_data) == 4) + return 1 == __builtin_ia32_ktestcsi(_M_data, _S_implicit_mask); + else if constexpr (sizeof(_M_data) == 8) + return 1 == __builtin_ia32_ktestcdi(_M_data, _S_implicit_mask); + } +#endif if constexpr (_S_is_partial) // PR120925 (partial kortest pattern not recognized) return (_M_data & _S_implicit_mask) == _S_implicit_mask; @@ -1233,6 +1246,19 @@ _M_any_of() const noexcept return _M_data; else if constexpr (_S_use_bitmask) { +#if _GLIBCXX_X86 + if (!__is_const_known(_M_data)) + { + if constexpr (sizeof(_M_data) == 1) + return 1 != __builtin_ia32_ktestzqi(_M_data, _S_implicit_mask); + else if constexpr (sizeof(_M_data) == 2) + return 1 != __builtin_ia32_ktestzhi(_M_data, _S_implicit_mask); + else if constexpr (sizeof(_M_data) == 4) + return 1 != __builtin_ia32_ktestzsi(_M_data, _S_implicit_mask); + else if constexpr (sizeof(_M_data) == 8) + return 1 != __builtin_ia32_ktestzdi(_M_data, _S_implicit_mask); + } +#endif if constexpr (_S_is_partial) // PR120925 (partial kortest pattern not recognized) return (_M_data & _S_implicit_mask) != 0; @@ -1255,6 +1281,19 @@ _M_none_of() const noexcept return !_M_data; else if constexpr (_S_use_bitmask) { +#if _GLIBCXX_X86 + if (!__is_const_known(_M_data)) + { + if constexpr (sizeof(_M_data) == 1) + return 1 == __builtin_ia32_ktestzqi(_M_data, _S_implicit_mask); + else if constexpr (sizeof(_M_data) == 2) + return 1 == __builtin_ia32_ktestzhi(_M_data, _S_implicit_mask); + else if constexpr (sizeof(_M_data) == 4) + return 1 == __builtin_ia32_ktestzsi(_M_data, _S_implicit_mask); + else if constexpr (sizeof(_M_data) == 8) + return 1 == __builtin_ia32_ktestzdi(_M_data, _S_implicit_mask); + } +#endif if constexpr (_S_is_partial) // PR120925 (partial kortest pattern not recognized) return (_M_data & _S_implicit_mask) == 0; -- ────────────────────────────────────────────────────────────────────────── Dr. Matthias Kretz https://mattkretz.github.io GSI Helmholtz Center for Heavy Ion Research https://gsi.de std::simd ──────────────────────────────────────────────────────────────────────────
signature.asc
Description: This is a digitally signed message part.
