25#ifndef _GLIBCXX_SIMD_FLAGS_H
26#define _GLIBCXX_SIMD_FLAGS_H 1
29#pragma GCC system_header
32#if __cplusplus >= 202400L
34#include "simd_details.h"
37namespace std _GLIBCXX_VISIBILITY(default)
39_GLIBCXX_BEGIN_NAMESPACE_VERSION
44 template <
typename _Tp,
typename _Up =
typename _Tp::value_type>
48 template <
typename _Tp,
typename _Ap, __vectorizable _Up>
49 struct alignment<basic_vec<_Tp, _Ap>, _Up>
50 : integral_constant<size_t, alignof(basic_vec<_Tp, _Ap>)>
53 template <
typename _Tp,
typename _Up =
typename _Tp::value_type>
54 constexpr size_t alignment_v = alignment<_Tp, _Up>::value;
77 template <
typename _Tp,
typename _Up>
78 [[__gnu__::__always_inline__]]
80 _S_adjust_pointer(_Up* __ptr)
81 {
return assume_aligned<simd::alignment_v<_Tp, remove_cv_t<_Up>>>(__ptr); }
92 struct __overaligned_flag
95 static_assert(__has_single_bit(_Np));
97 template <
typename,
typename _Up>
98 [[__gnu__::__always_inline__]]
100 _S_adjust_pointer(_Up* __ptr)
101 {
return assume_aligned<_Np>(__ptr); }
104 struct __partial_loadstore_flag
109 template <
typename _Tp>
110 concept __loadstore_tag = is_base_of_v<_LoadStoreTag, _Tp>;
112 template <
typename...>
115 template <
typename... _Flags>
116 requires (__loadstore_tag<_Flags> && ...)
117 struct flags<_Flags...>
123 template <
typename _F0>
124 static consteval bool
126 {
return (is_same_v<_Flags, _F0> || ...); }
128 friend consteval flags
132 template <
typename _T0,
typename... _More>
133 friend consteval auto
136 if constexpr ((same_as<_Flags, _T0> || ...))
137 return flags<_Flags...>{} | flags<_More...>{};
139 return flags<_Flags..., _T0>{} | flags<_More...>{};
154 template <
typename _Tp,
typename _Up>
155 static constexpr _Up*
156 _S_adjust_pointer(_Up* __ptr)
158 template for ([[maybe_unused]]
constexpr auto __f : {_Flags()...})
160 if constexpr (
requires {__f.template _S_adjust_pointer<_Tp>(__ptr); })
161 __ptr = __f.template _S_adjust_pointer<_Tp>(__ptr);
167 inline constexpr flags<> flag_default {};
169 inline constexpr flags<__convert_flag> flag_convert {};
171 inline constexpr flags<__aligned_flag> flag_aligned {};
173 template <
size_t _Np>
174 requires(__has_single_bit(_Np))
175 inline constexpr flags<__overaligned_flag<_Np>> flag_overaligned {};
180 inline constexpr flags<__partial_loadstore_flag> __allow_partial_loadstore {};
183_GLIBCXX_END_NAMESPACE_VERSION
ISO C++ entities toplevel namespace is std.
constexpr bitset< _Nb > operator|(const bitset< _Nb > &__x, const bitset< _Nb > &__y) noexcept
Global bitwise operations on bitsets.