]> git.ipfire.org Git - thirdparty/gcc.git/commit - libstdc++-v3/include/experimental/bits/simd_detail.h
libstdc++: Fix simd compilation with Clang
authorMatthias Kretz <m.kretz@gsi.de>
Thu, 23 Feb 2023 13:55:08 +0000 (14:55 +0100)
committerMatthias Kretz <m.kretz@gsi.de>
Tue, 21 Mar 2023 16:47:25 +0000 (17:47 +0100)
commit8ff3ca2d94721fab78f167d435d4ea4fa4fdca6a
treed68b0e73a0fc3fe8eb53bab4903cb8f7be5a0f82
parent041a164ec9b467f9ac2f15980f83f17e3f8ea150
libstdc++: Fix simd compilation with Clang

Clang fails to compile some constant expressions involving simd.
Therefore, just disable this non-conforming extension for clang.

Fix AVX512 blend implementation for Clang. It was converting the bitmask
to bool before, which is obviously wrong. Instead use a Clang builtin to
convert the bitmask to vector-mask before using a vector blend ?:. A
similar change is required for the masked unary implementation, because
the GCC builtins do not exist on Clang.

Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:

* include/experimental/bits/simd_detail.h: Don't declare the
simd API as constexpr with Clang.
* include/experimental/bits/simd_x86.h (__movm): New.
(_S_blend_avx512): Resolve FIXME. Implement blend using __movm
and ?:.
(_SimdImplX86::_S_masked_unary): Clang does not implement the
same builtins. Implement the function using __movm, ?:, and -
operators on vector_size types instead.
libstdc++-v3/include/experimental/bits/simd_detail.h
libstdc++-v3/include/experimental/bits/simd_x86.h