| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #ifndef _LIBCPP_EXPERIMENTAL___SIMD_DECLARATION_H |
| #define _LIBCPP_EXPERIMENTAL___SIMD_DECLARATION_H |
|
|
| #include <__config> |
| #include <__cstddef/size_t.h> |
|
|
| #if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL) |
|
|
| |
| # if defined(__AVX__) |
| # define _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES 32 |
| # else |
| # define _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES 16 |
| # endif |
|
|
| _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL |
| inline namespace parallelism_v2 { |
| namespace simd_abi { |
| template <int> |
| struct __vec_ext; |
| struct __scalar; |
|
|
| using scalar = __scalar; |
|
|
| |
| template <int _Np> |
| using fixed_size = __vec_ext<_Np>; |
|
|
| template <class _Tp> |
| inline constexpr int max_fixed_size = 32; |
|
|
| |
| template <class _Tp> |
| using compatible = __vec_ext<16 / sizeof(_Tp)>; |
|
|
| |
| template <class _Tp> |
| using native = __vec_ext<_LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES / sizeof(_Tp)>; |
|
|
| |
| template <class _Tp, size_t _Np, class... _Abis> |
| struct deduce { |
| using type _LIBCPP_NODEBUG = fixed_size<_Np>; |
| }; |
|
|
| |
| template <class _Tp, size_t _Np, class... _Abis> |
| using deduce_t = typename deduce<_Tp, _Np, _Abis...>::type; |
|
|
| } |
|
|
| template <class _Tp, class _Abi> |
| struct __simd_storage; |
|
|
| template <class _Tp, class _Abi> |
| struct __mask_storage; |
|
|
| template <class _Tp, class _Abi> |
| struct __simd_operations; |
|
|
| template <class _Tp, class _Abi> |
| struct __mask_operations; |
|
|
| struct element_aligned_tag; |
| struct vector_aligned_tag; |
| template <size_t> |
| struct overaligned_tag; |
|
|
| template <class _Tp, class _Abi = simd_abi::compatible<_Tp>> |
| class simd; |
|
|
| template <class _Tp, class _Abi = simd_abi::compatible<_Tp>> |
| class simd_mask; |
|
|
| } |
| _LIBCPP_END_NAMESPACE_EXPERIMENTAL |
|
|
| #endif |
| #endif |
|
|