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> 15cb14a3feSDimitry 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 } 59*7a6dacacSDimitry Andric 60*7a6dacacSDimitry Andric template <class _Up> 61*7a6dacacSDimitry Andric static _LIBCPP_HIDE_FROM_ABI void __load(_SimdStorage& __s, const _Up* __mem) noexcept { 62*7a6dacacSDimitry Andric __s.__data = static_cast<_Tp>(__mem[0]); 63*7a6dacacSDimitry Andric } 645f757f3fSDimitry Andric }; 655f757f3fSDimitry Andric 665f757f3fSDimitry Andric template <class _Tp> 675f757f3fSDimitry Andric struct __mask_operations<_Tp, simd_abi::__scalar> { 685f757f3fSDimitry Andric using _MaskStorage = __mask_storage<_Tp, simd_abi::__scalar>; 695f757f3fSDimitry Andric 705f757f3fSDimitry Andric static _LIBCPP_HIDE_FROM_ABI _MaskStorage __broadcast(bool __v) noexcept { return {__v}; } 71*7a6dacacSDimitry Andric 72*7a6dacacSDimitry Andric static _LIBCPP_HIDE_FROM_ABI void __load(_MaskStorage& __s, const bool* __mem) noexcept { __s.__data = __mem[0]; } 735f757f3fSDimitry Andric }; 745f757f3fSDimitry Andric 755f757f3fSDimitry Andric } // namespace parallelism_v2 765f757f3fSDimitry Andric _LIBCPP_END_NAMESPACE_EXPERIMENTAL 775f757f3fSDimitry Andric 785f757f3fSDimitry Andric #endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL) 795f757f3fSDimitry Andric #endif // _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H 80