xref: /freebsd-src/contrib/llvm-project/libcxx/include/experimental/__simd/declaration.h (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
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