15f757f3fSDimitry Andric // -*- C++ -*- 25f757f3fSDimitry Andric //===----------------------------------------------------------------------===// 35f757f3fSDimitry Andric // 45f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 55f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 65f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 75f757f3fSDimitry Andric // 85f757f3fSDimitry Andric //===----------------------------------------------------------------------===// 95f757f3fSDimitry Andric 105f757f3fSDimitry Andric #ifndef _LIBCPP_EXPERIMENTAL___SIMD_DECLARATION_H 115f757f3fSDimitry Andric #define _LIBCPP_EXPERIMENTAL___SIMD_DECLARATION_H 125f757f3fSDimitry Andric 13*cb14a3feSDimitry Andric #include <cstddef> 145f757f3fSDimitry Andric #include <experimental/__config> 155f757f3fSDimitry Andric 165f757f3fSDimitry Andric #if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL) 175f757f3fSDimitry Andric 185f757f3fSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL 195f757f3fSDimitry Andric inline namespace parallelism_v2 { 20*cb14a3feSDimitry Andric namespace simd_abi { 21*cb14a3feSDimitry Andric template <int> 22*cb14a3feSDimitry Andric struct __vec_ext; 23*cb14a3feSDimitry Andric struct __scalar; 24*cb14a3feSDimitry Andric 25*cb14a3feSDimitry Andric using scalar = __scalar; 26*cb14a3feSDimitry Andric 27*cb14a3feSDimitry Andric // TODO: make this platform dependent 28*cb14a3feSDimitry Andric template <int _Np> 29*cb14a3feSDimitry Andric using fixed_size = __vec_ext<_Np>; 30*cb14a3feSDimitry Andric 31*cb14a3feSDimitry Andric template <class _Tp> 32*cb14a3feSDimitry Andric inline constexpr int max_fixed_size = 32; 33*cb14a3feSDimitry Andric 34*cb14a3feSDimitry Andric // TODO: make this platform dependent 35*cb14a3feSDimitry Andric template <class _Tp> 36*cb14a3feSDimitry Andric using compatible = __vec_ext<16 / sizeof(_Tp)>; 37*cb14a3feSDimitry Andric 38*cb14a3feSDimitry Andric // TODO: make this platform dependent 39*cb14a3feSDimitry Andric template <class _Tp> 40*cb14a3feSDimitry Andric using native = __vec_ext<_LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES / sizeof(_Tp)>; 41*cb14a3feSDimitry Andric 42*cb14a3feSDimitry Andric // TODO: make this platform dependent 43*cb14a3feSDimitry Andric template <class _Tp, size_t _Np, class... _Abis> 44*cb14a3feSDimitry Andric struct deduce { 45*cb14a3feSDimitry Andric using type = fixed_size<_Np>; 46*cb14a3feSDimitry Andric }; 47*cb14a3feSDimitry Andric 48*cb14a3feSDimitry Andric // TODO: make this platform dependent 49*cb14a3feSDimitry Andric template <class _Tp, size_t _Np, class... _Abis> 50*cb14a3feSDimitry Andric using deduce_t = typename deduce<_Tp, _Np, _Abis...>::type; 51*cb14a3feSDimitry Andric 52*cb14a3feSDimitry Andric } // namespace simd_abi 53*cb14a3feSDimitry Andric 54*cb14a3feSDimitry Andric template <class _Tp, class _Abi> 55*cb14a3feSDimitry Andric struct __simd_storage; 56*cb14a3feSDimitry Andric 57*cb14a3feSDimitry Andric template <class _Tp, class _Abi> 58*cb14a3feSDimitry Andric struct __mask_storage; 59*cb14a3feSDimitry Andric 60*cb14a3feSDimitry Andric template <class _Tp, class _Abi> 61*cb14a3feSDimitry Andric struct __simd_operations; 62*cb14a3feSDimitry Andric 63*cb14a3feSDimitry Andric template <class _Tp, class _Abi> 64*cb14a3feSDimitry Andric struct __mask_operations; 65*cb14a3feSDimitry Andric 66*cb14a3feSDimitry Andric struct element_aligned_tag; 67*cb14a3feSDimitry Andric struct vector_aligned_tag; 68*cb14a3feSDimitry Andric template <size_t> 69*cb14a3feSDimitry Andric struct overaligned_tag; 705f757f3fSDimitry Andric 715f757f3fSDimitry Andric template <class _Tp, class _Abi = simd_abi::compatible<_Tp>> 725f757f3fSDimitry Andric class simd; 735f757f3fSDimitry Andric 745f757f3fSDimitry Andric template <class _Tp, class _Abi = simd_abi::compatible<_Tp>> 755f757f3fSDimitry Andric class simd_mask; 765f757f3fSDimitry Andric 775f757f3fSDimitry Andric } // namespace parallelism_v2 785f757f3fSDimitry Andric _LIBCPP_END_NAMESPACE_EXPERIMENTAL 795f757f3fSDimitry Andric 805f757f3fSDimitry Andric #endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL) 815f757f3fSDimitry Andric #endif // _LIBCPP_EXPERIMENTAL___SIMD_DECLARATION_H 82