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_SCALAR_H 115f757f3fSDimitry Andric #define _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H 125f757f3fSDimitry Andric 135f757f3fSDimitry Andric #include <cstddef> 145f757f3fSDimitry Andric #include <experimental/__config> 15*cb14a3feSDimitry Andric #include <experimental/__simd/declaration.h> 165f757f3fSDimitry Andric #include <experimental/__simd/traits.h> 175f757f3fSDimitry Andric 185f757f3fSDimitry Andric #if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL) 195f757f3fSDimitry Andric 205f757f3fSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL 215f757f3fSDimitry Andric inline namespace parallelism_v2 { 225f757f3fSDimitry Andric namespace simd_abi { 235f757f3fSDimitry Andric struct __scalar { 245f757f3fSDimitry Andric static constexpr size_t __simd_size = 1; 255f757f3fSDimitry Andric }; 265f757f3fSDimitry Andric } // namespace simd_abi 275f757f3fSDimitry Andric 285f757f3fSDimitry Andric template <> 295f757f3fSDimitry Andric inline constexpr bool is_abi_tag_v<simd_abi::__scalar> = true; 305f757f3fSDimitry Andric 315f757f3fSDimitry Andric template <class _Tp> 325f757f3fSDimitry Andric struct __simd_storage<_Tp, simd_abi::__scalar> { 335f757f3fSDimitry Andric _Tp __data; 345f757f3fSDimitry Andric 355f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI _Tp __get([[maybe_unused]] size_t __idx) const noexcept { 365f757f3fSDimitry Andric _LIBCPP_ASSERT_UNCATEGORIZED(__idx == 0, "Index is out of bounds"); 375f757f3fSDimitry Andric return __data; 385f757f3fSDimitry Andric } 395f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI void __set([[maybe_unused]] size_t __idx, _Tp __v) noexcept { 405f757f3fSDimitry Andric _LIBCPP_ASSERT_UNCATEGORIZED(__idx == 0, "Index is out of bounds"); 415f757f3fSDimitry Andric __data = __v; 425f757f3fSDimitry Andric } 435f757f3fSDimitry Andric }; 445f757f3fSDimitry Andric 455f757f3fSDimitry Andric template <class _Tp> 465f757f3fSDimitry Andric struct __mask_storage<_Tp, simd_abi::__scalar> : __simd_storage<bool, simd_abi::__scalar> {}; 475f757f3fSDimitry Andric 485f757f3fSDimitry Andric template <class _Tp> 495f757f3fSDimitry Andric struct __simd_operations<_Tp, simd_abi::__scalar> { 505f757f3fSDimitry Andric using _SimdStorage = __simd_storage<_Tp, simd_abi::__scalar>; 515f757f3fSDimitry Andric using _MaskStorage = __mask_storage<_Tp, simd_abi::__scalar>; 525f757f3fSDimitry Andric 535f757f3fSDimitry Andric static _LIBCPP_HIDE_FROM_ABI _SimdStorage __broadcast(_Tp __v) noexcept { return {__v}; } 545f757f3fSDimitry Andric 555f757f3fSDimitry Andric template <class _Generator> 565f757f3fSDimitry Andric static _LIBCPP_HIDE_FROM_ABI _SimdStorage __generate(_Generator&& __g) noexcept { 575f757f3fSDimitry Andric return {__g(std::integral_constant<size_t, 0>())}; 585f757f3fSDimitry Andric } 595f757f3fSDimitry Andric }; 605f757f3fSDimitry Andric 615f757f3fSDimitry Andric template <class _Tp> 625f757f3fSDimitry Andric struct __mask_operations<_Tp, simd_abi::__scalar> { 635f757f3fSDimitry Andric using _MaskStorage = __mask_storage<_Tp, simd_abi::__scalar>; 645f757f3fSDimitry Andric 655f757f3fSDimitry Andric static _LIBCPP_HIDE_FROM_ABI _MaskStorage __broadcast(bool __v) noexcept { return {__v}; } 665f757f3fSDimitry Andric }; 675f757f3fSDimitry Andric 685f757f3fSDimitry Andric } // namespace parallelism_v2 695f757f3fSDimitry Andric _LIBCPP_END_NAMESPACE_EXPERIMENTAL 705f757f3fSDimitry Andric 715f757f3fSDimitry Andric #endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL) 725f757f3fSDimitry Andric #endif // _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H 73