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
──────────────────────────────────────────────────────────────────────────

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to