diff options
author | Matthias Kretz <m.kretz@gsi.de> | 2023-03-22 08:12:08 +0100 |
---|---|---|
committer | Matthias Kretz <m.kretz@gsi.de> | 2023-05-25 09:04:03 +0200 |
commit | 7bb263e88706e15983cd31d5ff5f509e75758681 (patch) | |
tree | 376482b59221d532d5ace1ba234af229190b5406 /libstdc++-v3 | |
parent | 31f957671a4177b38eabc3760ed8cf9518bd38f1 (diff) |
libstdc++: Add missing trait is_simd_flag_type
Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:
* include/experimental/bits/simd.h (is_simd_flag_type): New.
(_IsSimdFlagType): New.
(copy_from, copy_to, load ctors): Constrain _Flags using
_IsSimdFlagType.
(cherry picked from commit 97383b4116ea63486eb5bfb0a7140871bed75fb4)
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/include/experimental/bits/simd.h | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/libstdc++-v3/include/experimental/bits/simd.h b/libstdc++-v3/include/experimental/bits/simd.h index 0bf1fa5c6e4..f6e8f3b24c4 100644 --- a/libstdc++-v3/include/experimental/bits/simd.h +++ b/libstdc++-v3/include/experimental/bits/simd.h @@ -2708,6 +2708,32 @@ template <typename _Tp> } // namespace simd_abi // traits {{{1 +template <typename _Tp> + struct is_simd_flag_type + : false_type + {}; + +template <> + struct is_simd_flag_type<element_aligned_tag> + : true_type + {}; + +template <> + struct is_simd_flag_type<vector_aligned_tag> + : true_type + {}; + +template <size_t _Np> + struct is_simd_flag_type<overaligned_tag<_Np>> + : __bool_constant<(_Np > 0) and __has_single_bit(_Np)> + {}; + +template <typename _Tp> + inline constexpr bool is_simd_flag_type_v = is_simd_flag_type<_Tp>::value; + +template <typename _Tp, typename = enable_if_t<is_simd_flag_type_v<_Tp>>> + using _IsSimdFlagType = _Tp; + // is_abi_tag {{{2 template <typename _Tp, typename = void_t<>> struct is_abi_tag : false_type {}; @@ -3127,7 +3153,7 @@ template <typename _M, typename _Tp> template <typename _Up, typename _Flags> [[nodiscard]] _GLIBCXX_SIMD_INTRINSIC _V - copy_from(const _LoadStorePtr<_Up, value_type>* __mem, _Flags) const&& + copy_from(const _LoadStorePtr<_Up, value_type>* __mem, _IsSimdFlagType<_Flags>) const&& { return {__private_init, _Impl::_S_masked_load(__data(_M_value), __data(_M_k), @@ -3136,7 +3162,7 @@ template <typename _M, typename _Tp> template <typename _Up, typename _Flags> _GLIBCXX_SIMD_INTRINSIC void - copy_to(_LoadStorePtr<_Up, value_type>* __mem, _Flags) const&& + copy_to(_LoadStorePtr<_Up, value_type>* __mem, _IsSimdFlagType<_Flags>) const&& { _Impl::_S_masked_store(__data(_M_value), _Flags::template _S_apply<_V>(__mem), @@ -3182,12 +3208,12 @@ template <typename _Tp> template <typename _Up, typename _Flags> [[nodiscard]] _GLIBCXX_SIMD_INTRINSIC _V - copy_from(const _LoadStorePtr<_Up, value_type>* __mem, _Flags) const&& + copy_from(const _LoadStorePtr<_Up, value_type>* __mem, _IsSimdFlagType<_Flags>) const&& { return _M_k ? static_cast<_V>(__mem[0]) : _M_value; } template <typename _Up, typename _Flags> _GLIBCXX_SIMD_INTRINSIC void - copy_to(_LoadStorePtr<_Up, value_type>* __mem, _Flags) const&& + copy_to(_LoadStorePtr<_Up, value_type>* __mem, _IsSimdFlagType<_Flags>) const&& { if (_M_k) __mem[0] = _M_value; @@ -3285,7 +3311,7 @@ template <typename _M, typename _Tp> // intentionally hides const_where_expression::copy_from template <typename _Up, typename _Flags> _GLIBCXX_SIMD_INTRINSIC void - copy_from(const _LoadStorePtr<_Up, value_type>* __mem, _Flags) && + copy_from(const _LoadStorePtr<_Up, value_type>* __mem, _IsSimdFlagType<_Flags>) && { __data(_M_value) = _Impl::_S_masked_load(__data(_M_value), __data(_M_k), _Flags::template _S_apply<_Tp>(__mem)); @@ -3348,7 +3374,7 @@ template <typename _Tp> // intentionally hides const_where_expression::copy_from template <typename _Up, typename _Flags> _GLIBCXX_SIMD_INTRINSIC void - copy_from(const _LoadStorePtr<_Up, value_type>* __mem, _Flags) && + copy_from(const _LoadStorePtr<_Up, value_type>* __mem, _IsSimdFlagType<_Flags>) && { if (_M_k) _M_value = __mem[0]; } }; @@ -4393,12 +4419,12 @@ template <typename _Tp, typename _Abi> // load constructor {{{ template <typename _Flags> _GLIBCXX_SIMD_ALWAYS_INLINE - simd_mask(const value_type* __mem, _Flags) + simd_mask(const value_type* __mem, _IsSimdFlagType<_Flags>) : _M_data(_Impl::template _S_load<_Ip>(_Flags::template _S_apply<simd_mask>(__mem))) {} template <typename _Flags> _GLIBCXX_SIMD_ALWAYS_INLINE - simd_mask(const value_type* __mem, simd_mask __k, _Flags) + simd_mask(const value_type* __mem, simd_mask __k, _IsSimdFlagType<_Flags>) : _M_data{} { _M_data = _Impl::_S_masked_load(_M_data, __k._M_data, @@ -4409,14 +4435,14 @@ template <typename _Tp, typename _Abi> // loads [simd_mask.load] {{{ template <typename _Flags> _GLIBCXX_SIMD_ALWAYS_INLINE void - copy_from(const value_type* __mem, _Flags) + copy_from(const value_type* __mem, _IsSimdFlagType<_Flags>) { _M_data = _Impl::template _S_load<_Ip>(_Flags::template _S_apply<simd_mask>(__mem)); } // }}} // stores [simd_mask.store] {{{ template <typename _Flags> _GLIBCXX_SIMD_ALWAYS_INLINE void - copy_to(value_type* __mem, _Flags) const + copy_to(value_type* __mem, _IsSimdFlagType<_Flags>) const { _Impl::_S_store(_M_data, _Flags::template _S_apply<simd_mask>(__mem)); } // }}} @@ -4996,7 +5022,7 @@ template <typename _Tp, typename _Abi> // load constructor template <typename _Up, typename _Flags> _GLIBCXX_SIMD_ALWAYS_INLINE - simd(const _Up* __mem, _Flags) + simd(const _Up* __mem, _IsSimdFlagType<_Flags>) : _M_data( _Impl::_S_load(_Flags::template _S_apply<simd>(__mem), _S_type_tag)) {} @@ -5004,7 +5030,7 @@ template <typename _Tp, typename _Abi> // loads [simd.load] template <typename _Up, typename _Flags> _GLIBCXX_SIMD_ALWAYS_INLINE void - copy_from(const _Vectorizable<_Up>* __mem, _Flags) + copy_from(const _Vectorizable<_Up>* __mem, _IsSimdFlagType<_Flags>) { _M_data = static_cast<decltype(_M_data)>( _Impl::_S_load(_Flags::template _S_apply<simd>(__mem), _S_type_tag)); @@ -5013,7 +5039,7 @@ template <typename _Tp, typename _Abi> // stores [simd.store] template <typename _Up, typename _Flags> _GLIBCXX_SIMD_ALWAYS_INLINE void - copy_to(_Vectorizable<_Up>* __mem, _Flags) const + copy_to(_Vectorizable<_Up>* __mem, _IsSimdFlagType<_Flags>) const { _Impl::_S_store(_M_data, _Flags::template _S_apply<simd>(__mem), _S_type_tag); |