diff --git a/libstdc++-v3/include/experimental/bits/simd.h b/libstdc++-v3/include/experimental/bits/simd.h index 4df446654ac..224153ffbaf 100644 --- a/libstdc++-v3/include/experimental/bits/simd.h +++ b/libstdc++-v3/include/experimental/bits/simd.h @@ -2837,6 +2837,32 @@ __determine_native_abi() } // namespace simd_abi // traits {{{1 +template + struct is_simd_flag_type + : false_type + {}; + +template <> + struct is_simd_flag_type + : true_type + {}; + +template <> + struct is_simd_flag_type + : true_type + {}; + +template + struct is_simd_flag_type> + : __bool_constant<(_Np > 0) and __has_single_bit(_Np)> + {}; + +template + inline constexpr bool is_simd_flag_type_v = is_simd_flag_type<_Tp>::value; + +template >> + using _IsSimdFlagType = _Tp; + // is_abi_tag {{{2 template > struct is_abi_tag : false_type {}; @@ -3308,7 +3334,7 @@ __get_lvalue(const const_where_expression& __x) template [[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), @@ -3317,7 +3343,7 @@ __get_lvalue(const const_where_expression& __x) template _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), @@ -3363,12 +3389,12 @@ __get_lvalue(const const_where_expression& __x) template [[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 _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; @@ -3466,7 +3492,7 @@ static_assert( // intentionally hides const_where_expression::copy_from template _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)); @@ -3529,7 +3555,7 @@ where_expression(const _M& __kk, _Tp& dd) // intentionally hides const_where_expression::copy_from template _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]; } }; @@ -4574,12 +4600,12 @@ simd_mask(const simd_mask<_Up, simd_abi::fixed_size>& __x) // load constructor {{{ template _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(__mem))) {} template _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, @@ -4590,14 +4616,14 @@ simd_mask(const simd_mask<_Up, simd_abi::fixed_size>& __x) // loads [simd_mask.load] {{{ template _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(__mem)); } // }}} // stores [simd_mask.store] {{{ template _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(__mem)); } // }}} @@ -5210,7 +5236,7 @@ simd(const simd<_Up, _A2>& __x) // load constructor template _GLIBCXX_SIMD_ALWAYS_INLINE - simd(const _Up* __mem, _Flags) + simd(const _Up* __mem, _IsSimdFlagType<_Flags>) : _M_data( _Impl::_S_load(_Flags::template _S_apply(__mem), _S_type_tag)) {} @@ -5218,7 +5244,7 @@ simd(const simd<_Up, _A2>& __x) // loads [simd.load] template _GLIBCXX_SIMD_ALWAYS_INLINE void - copy_from(const _Vectorizable<_Up>* __mem, _Flags) + copy_from(const _Vectorizable<_Up>* __mem, _IsSimdFlagType<_Flags>) { _M_data = static_cast( _Impl::_S_load(_Flags::template _S_apply(__mem), _S_type_tag)); @@ -5227,7 +5253,7 @@ simd(const simd<_Up, _A2>& __x) // stores [simd.store] template _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(__mem), _S_type_tag);