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