[PATCH 1/5] libstdc++: Use ktest on simd::mask reduction for AVX512

Matthias Kretz MatthiasKretz@gmx.net
Mon Mar 2 10:14:53 GMT 2026


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 <m.kretz@gsi.de>

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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: This is a digitally signed message part.
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260302/0daf8381/attachment-0001.sig>


More information about the Libstdc++ mailing list