| // -*- C++ -*- | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #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) | |
| // TODO: support more targets | |
| # 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; | |
| // TODO: make this platform dependent | |
| template <int _Np> | |
| using fixed_size = __vec_ext<_Np>; | |
| template <class _Tp> | |
| inline constexpr int max_fixed_size = 32; | |
| // TODO: make this platform dependent | |
| template <class _Tp> | |
| using compatible = __vec_ext<16 / sizeof(_Tp)>; | |
| // TODO: make this platform dependent | |
| template <class _Tp> | |
| using native = __vec_ext<_LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES / sizeof(_Tp)>; | |
| // TODO: make this platform dependent | |
| template <class _Tp, size_t _Np, class... _Abis> | |
| struct deduce { | |
| using type _LIBCPP_NODEBUG = fixed_size<_Np>; | |
| }; | |
| // TODO: make this platform dependent | |
| template <class _Tp, size_t _Np, class... _Abis> | |
| using deduce_t = typename deduce<_Tp, _Np, _Abis...>::type; | |
| } // namespace simd_abi | |
| 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; | |
| } // namespace parallelism_v2 | |
| _LIBCPP_END_NAMESPACE_EXPERIMENTAL | |
| #endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL) | |
| #endif // _LIBCPP_EXPERIMENTAL___SIMD_DECLARATION_H |