aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorMatthias Kretz <m.kretz@gsi.de>2024-06-14 15:11:25 +0200
committerMatthias Kretz <m.kretz@gsi.de>2024-06-20 13:28:06 +0200
commite77f314ccd422ffa05c6c06837e2cb94c25f2bba (patch)
treebd7fd67c301abbad3a04a73e427a37525d1d40aa /libstdc++-v3/include
parentd26fa1c73b2c0f7fd2d412ce7b4e84e0f78fc49a (diff)
downloadgcc-e77f314ccd422ffa05c6c06837e2cb94c25f2bba.zip
gcc-e77f314ccd422ffa05c6c06837e2cb94c25f2bba.tar.gz
gcc-e77f314ccd422ffa05c6c06837e2cb94c25f2bba.tar.bz2
libstdc++: Fix find_last_set(simd_mask) to ignore padding bits
With the change to the AVX512 find_last_set implementation, the change to AVX512 operator!= is unnecessary. However, the latter was not producing optimal code and unnecessarily set the padding bits. In theory, the compiler could determine that with the new != implementation, the bit operation for clearing the padding bits is a no-op and can be elided. Signed-off-by: Matthias Kretz <m.kretz@gsi.de> libstdc++-v3/ChangeLog: PR libstdc++/115454 * include/experimental/bits/simd_x86.h (_S_not_equal_to): Use neq comparison instead of bitwise negation after eq. (_S_find_last_set): Clear unused high bits before computing bit_width. * testsuite/experimental/simd/pr115454_find_last_set.cc: New test. (cherry picked from commit 1340ddea0158de3f49aeb75b4013e5fc313ff6f4)
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r--libstdc++-v3/include/experimental/bits/simd_x86.h26
1 files changed, 13 insertions, 13 deletions
diff --git a/libstdc++-v3/include/experimental/bits/simd_x86.h b/libstdc++-v3/include/experimental/bits/simd_x86.h
index 517c4b4..8a23aa2 100644
--- a/libstdc++-v3/include/experimental/bits/simd_x86.h
+++ b/libstdc++-v3/include/experimental/bits/simd_x86.h
@@ -2339,29 +2339,29 @@ template <typename _Abi, typename>
__assert_unreachable<_Tp>();
}
else if constexpr (sizeof(__xi) == 64 && sizeof(_Tp) == 8)
- return ~_mm512_mask_cmpeq_epi64_mask(__k1, __xi, __yi);
+ return _mm512_mask_cmpneq_epi64_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 64 && sizeof(_Tp) == 4)
- return ~_mm512_mask_cmpeq_epi32_mask(__k1, __xi, __yi);
+ return _mm512_mask_cmpneq_epi32_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 64 && sizeof(_Tp) == 2)
- return ~_mm512_mask_cmpeq_epi16_mask(__k1, __xi, __yi);
+ return _mm512_mask_cmpneq_epi16_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 64 && sizeof(_Tp) == 1)
- return ~_mm512_mask_cmpeq_epi8_mask(__k1, __xi, __yi);
+ return _mm512_mask_cmpneq_epi8_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 32 && sizeof(_Tp) == 8)
- return ~_mm256_mask_cmpeq_epi64_mask(__k1, __xi, __yi);
+ return _mm256_mask_cmpneq_epi64_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 32 && sizeof(_Tp) == 4)
- return ~_mm256_mask_cmpeq_epi32_mask(__k1, __xi, __yi);
+ return _mm256_mask_cmpneq_epi32_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 32 && sizeof(_Tp) == 2)
- return ~_mm256_mask_cmpeq_epi16_mask(__k1, __xi, __yi);
+ return _mm256_mask_cmpneq_epi16_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 32 && sizeof(_Tp) == 1)
- return ~_mm256_mask_cmpeq_epi8_mask(__k1, __xi, __yi);
+ return _mm256_mask_cmpneq_epi8_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 16 && sizeof(_Tp) == 8)
- return ~_mm_mask_cmpeq_epi64_mask(__k1, __xi, __yi);
+ return _mm_mask_cmpneq_epi64_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 16 && sizeof(_Tp) == 4)
- return ~_mm_mask_cmpeq_epi32_mask(__k1, __xi, __yi);
+ return _mm_mask_cmpneq_epi32_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 16 && sizeof(_Tp) == 2)
- return ~_mm_mask_cmpeq_epi16_mask(__k1, __xi, __yi);
+ return _mm_mask_cmpneq_epi16_mask(__k1, __xi, __yi);
else if constexpr (sizeof(__xi) == 16 && sizeof(_Tp) == 1)
- return ~_mm_mask_cmpeq_epi8_mask(__k1, __xi, __yi);
+ return _mm_mask_cmpneq_epi8_mask(__k1, __xi, __yi);
else
__assert_unreachable<_Tp>();
} // }}}
@@ -5292,7 +5292,7 @@ template <typename _Abi, typename>
_S_find_last_set(simd_mask<_Tp, _Abi> __k)
{
if constexpr (__is_avx512_abi<_Abi>())
- return std::__bit_width(__k._M_data._M_data) - 1;
+ return std::__bit_width(_Abi::_S_masked(__k._M_data)._M_data) - 1;
else
return _Base::_S_find_last_set(__k);
}