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