xref: /freebsd-src/contrib/llvm-project/libcxx/include/experimental/__simd/scalar.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1*5f757f3fSDimitry Andric // -*- C++ -*-
2*5f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
3*5f757f3fSDimitry Andric //
4*5f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*5f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
6*5f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*5f757f3fSDimitry Andric //
8*5f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
9*5f757f3fSDimitry Andric 
10*5f757f3fSDimitry Andric #ifndef _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H
11*5f757f3fSDimitry Andric #define _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H
12*5f757f3fSDimitry Andric 
13*5f757f3fSDimitry Andric #include <cstddef>
14*5f757f3fSDimitry Andric #include <experimental/__config>
15*5f757f3fSDimitry Andric #include <experimental/__simd/internal_declaration.h>
16*5f757f3fSDimitry Andric #include <experimental/__simd/traits.h>
17*5f757f3fSDimitry Andric 
18*5f757f3fSDimitry Andric #if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
19*5f757f3fSDimitry Andric 
20*5f757f3fSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
21*5f757f3fSDimitry Andric inline namespace parallelism_v2 {
22*5f757f3fSDimitry Andric namespace simd_abi {
23*5f757f3fSDimitry Andric struct __scalar {
24*5f757f3fSDimitry Andric   static constexpr size_t __simd_size = 1;
25*5f757f3fSDimitry Andric };
26*5f757f3fSDimitry Andric } // namespace simd_abi
27*5f757f3fSDimitry Andric 
28*5f757f3fSDimitry Andric template <>
29*5f757f3fSDimitry Andric inline constexpr bool is_abi_tag_v<simd_abi::__scalar> = true;
30*5f757f3fSDimitry Andric 
31*5f757f3fSDimitry Andric template <class _Tp>
32*5f757f3fSDimitry Andric struct __simd_storage<_Tp, simd_abi::__scalar> {
33*5f757f3fSDimitry Andric   _Tp __data;
34*5f757f3fSDimitry Andric 
35*5f757f3fSDimitry Andric   _LIBCPP_HIDE_FROM_ABI _Tp __get([[maybe_unused]] size_t __idx) const noexcept {
36*5f757f3fSDimitry Andric     _LIBCPP_ASSERT_UNCATEGORIZED(__idx == 0, "Index is out of bounds");
37*5f757f3fSDimitry Andric     return __data;
38*5f757f3fSDimitry Andric   }
39*5f757f3fSDimitry Andric   _LIBCPP_HIDE_FROM_ABI void __set([[maybe_unused]] size_t __idx, _Tp __v) noexcept {
40*5f757f3fSDimitry Andric     _LIBCPP_ASSERT_UNCATEGORIZED(__idx == 0, "Index is out of bounds");
41*5f757f3fSDimitry Andric     __data = __v;
42*5f757f3fSDimitry Andric   }
43*5f757f3fSDimitry Andric };
44*5f757f3fSDimitry Andric 
45*5f757f3fSDimitry Andric template <class _Tp>
46*5f757f3fSDimitry Andric struct __mask_storage<_Tp, simd_abi::__scalar> : __simd_storage<bool, simd_abi::__scalar> {};
47*5f757f3fSDimitry Andric 
48*5f757f3fSDimitry Andric template <class _Tp>
49*5f757f3fSDimitry Andric struct __simd_operations<_Tp, simd_abi::__scalar> {
50*5f757f3fSDimitry Andric   using _SimdStorage = __simd_storage<_Tp, simd_abi::__scalar>;
51*5f757f3fSDimitry Andric   using _MaskStorage = __mask_storage<_Tp, simd_abi::__scalar>;
52*5f757f3fSDimitry Andric 
53*5f757f3fSDimitry Andric   static _LIBCPP_HIDE_FROM_ABI _SimdStorage __broadcast(_Tp __v) noexcept { return {__v}; }
54*5f757f3fSDimitry Andric 
55*5f757f3fSDimitry Andric   template <class _Generator>
56*5f757f3fSDimitry Andric   static _LIBCPP_HIDE_FROM_ABI _SimdStorage __generate(_Generator&& __g) noexcept {
57*5f757f3fSDimitry Andric     return {__g(std::integral_constant<size_t, 0>())};
58*5f757f3fSDimitry Andric   }
59*5f757f3fSDimitry Andric };
60*5f757f3fSDimitry Andric 
61*5f757f3fSDimitry Andric template <class _Tp>
62*5f757f3fSDimitry Andric struct __mask_operations<_Tp, simd_abi::__scalar> {
63*5f757f3fSDimitry Andric   using _MaskStorage = __mask_storage<_Tp, simd_abi::__scalar>;
64*5f757f3fSDimitry Andric 
65*5f757f3fSDimitry Andric   static _LIBCPP_HIDE_FROM_ABI _MaskStorage __broadcast(bool __v) noexcept { return {__v}; }
66*5f757f3fSDimitry Andric };
67*5f757f3fSDimitry Andric 
68*5f757f3fSDimitry Andric } // namespace parallelism_v2
69*5f757f3fSDimitry Andric _LIBCPP_END_NAMESPACE_EXPERIMENTAL
70*5f757f3fSDimitry Andric 
71*5f757f3fSDimitry Andric #endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
72*5f757f3fSDimitry Andric #endif // _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H
73