xref: /llvm-project/libcxx/include/experimental/__simd/declaration.h (revision e99c4906e44ae3f921fa05356909d006cda8d954)
1ce5652c7SZhangyin // -*- C++ -*-
2ce5652c7SZhangyin //===----------------------------------------------------------------------===//
3ce5652c7SZhangyin //
4ce5652c7SZhangyin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5ce5652c7SZhangyin // See https://llvm.org/LICENSE.txt for license information.
6ce5652c7SZhangyin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7ce5652c7SZhangyin //
8ce5652c7SZhangyin //===----------------------------------------------------------------------===//
9ce5652c7SZhangyin 
10ce5652c7SZhangyin #ifndef _LIBCPP_EXPERIMENTAL___SIMD_DECLARATION_H
11ce5652c7SZhangyin #define _LIBCPP_EXPERIMENTAL___SIMD_DECLARATION_H
12ce5652c7SZhangyin 
13118f120eSLouis Dionne #include <__config>
14*e99c4906SNikolas Klauser #include <__cstddef/size_t.h>
151314e877Sphilnik777 
16ce5652c7SZhangyin #if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
17ce5652c7SZhangyin 
18118f120eSLouis Dionne // TODO: support more targets
19118f120eSLouis Dionne #  if defined(__AVX__)
20118f120eSLouis Dionne #    define _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES 32
21118f120eSLouis Dionne #  else
22118f120eSLouis Dionne #    define _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES 16
23118f120eSLouis Dionne #  endif
24118f120eSLouis Dionne 
25ce5652c7SZhangyin _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
26ce5652c7SZhangyin inline namespace parallelism_v2 {
2750ae0da0SNikolas Klauser namespace simd_abi {
2850ae0da0SNikolas Klauser template <int>
2950ae0da0SNikolas Klauser struct __vec_ext;
3050ae0da0SNikolas Klauser struct __scalar;
3150ae0da0SNikolas Klauser 
3250ae0da0SNikolas Klauser using scalar = __scalar;
3350ae0da0SNikolas Klauser 
3450ae0da0SNikolas Klauser // TODO: make this platform dependent
3550ae0da0SNikolas Klauser template <int _Np>
3650ae0da0SNikolas Klauser using fixed_size = __vec_ext<_Np>;
3750ae0da0SNikolas Klauser 
3850ae0da0SNikolas Klauser template <class _Tp>
3950ae0da0SNikolas Klauser inline constexpr int max_fixed_size = 32;
4050ae0da0SNikolas Klauser 
4150ae0da0SNikolas Klauser // TODO: make this platform dependent
4250ae0da0SNikolas Klauser template <class _Tp>
4350ae0da0SNikolas Klauser using compatible = __vec_ext<16 / sizeof(_Tp)>;
4450ae0da0SNikolas Klauser 
4550ae0da0SNikolas Klauser // TODO: make this platform dependent
4650ae0da0SNikolas Klauser template <class _Tp>
4750ae0da0SNikolas Klauser using native = __vec_ext<_LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES / sizeof(_Tp)>;
4850ae0da0SNikolas Klauser 
4950ae0da0SNikolas Klauser // TODO: make this platform dependent
5050ae0da0SNikolas Klauser template <class _Tp, size_t _Np, class... _Abis>
5150ae0da0SNikolas Klauser struct deduce {
5250ae0da0SNikolas Klauser   using type = fixed_size<_Np>;
5350ae0da0SNikolas Klauser };
5450ae0da0SNikolas Klauser 
5550ae0da0SNikolas Klauser // TODO: make this platform dependent
5650ae0da0SNikolas Klauser template <class _Tp, size_t _Np, class... _Abis>
5750ae0da0SNikolas Klauser using deduce_t = typename deduce<_Tp, _Np, _Abis...>::type;
5850ae0da0SNikolas Klauser 
5950ae0da0SNikolas Klauser } // namespace simd_abi
6050ae0da0SNikolas Klauser 
6150ae0da0SNikolas Klauser template <class _Tp, class _Abi>
6250ae0da0SNikolas Klauser struct __simd_storage;
6350ae0da0SNikolas Klauser 
6450ae0da0SNikolas Klauser template <class _Tp, class _Abi>
6550ae0da0SNikolas Klauser struct __mask_storage;
6650ae0da0SNikolas Klauser 
6750ae0da0SNikolas Klauser template <class _Tp, class _Abi>
6850ae0da0SNikolas Klauser struct __simd_operations;
6950ae0da0SNikolas Klauser 
7050ae0da0SNikolas Klauser template <class _Tp, class _Abi>
7150ae0da0SNikolas Klauser struct __mask_operations;
7250ae0da0SNikolas Klauser 
7350ae0da0SNikolas Klauser struct element_aligned_tag;
7450ae0da0SNikolas Klauser struct vector_aligned_tag;
7550ae0da0SNikolas Klauser template <size_t>
7650ae0da0SNikolas Klauser struct overaligned_tag;
77ce5652c7SZhangyin 
78ce5652c7SZhangyin template <class _Tp, class _Abi = simd_abi::compatible<_Tp>>
79ce5652c7SZhangyin class simd;
80ce5652c7SZhangyin 
81ce5652c7SZhangyin template <class _Tp, class _Abi = simd_abi::compatible<_Tp>>
82ce5652c7SZhangyin class simd_mask;
83ce5652c7SZhangyin 
84ce5652c7SZhangyin } // namespace parallelism_v2
85ce5652c7SZhangyin _LIBCPP_END_NAMESPACE_EXPERIMENTAL
86ce5652c7SZhangyin 
87ce5652c7SZhangyin #endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
88ce5652c7SZhangyin #endif // _LIBCPP_EXPERIMENTAL___SIMD_DECLARATION_H
89