[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