aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/libcxx/include/experimental/__simd/scalar.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/libcxx/include/experimental/__simd/scalar.h')
-rw-r--r--contrib/llvm-project/libcxx/include/experimental/__simd/scalar.h72
1 files changed, 72 insertions, 0 deletions
diff --git a/contrib/llvm-project/libcxx/include/experimental/__simd/scalar.h b/contrib/llvm-project/libcxx/include/experimental/__simd/scalar.h
new file mode 100644
index 000000000000..53fa1c29f374
--- /dev/null
+++ b/contrib/llvm-project/libcxx/include/experimental/__simd/scalar.h
@@ -0,0 +1,72 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H
+#define _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H
+
+#include <cstddef>
+#include <experimental/__config>
+#include <experimental/__simd/internal_declaration.h>
+#include <experimental/__simd/traits.h>
+
+#if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+
+_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
+inline namespace parallelism_v2 {
+namespace simd_abi {
+struct __scalar {
+ static constexpr size_t __simd_size = 1;
+};
+} // namespace simd_abi
+
+template <>
+inline constexpr bool is_abi_tag_v<simd_abi::__scalar> = true;
+
+template <class _Tp>
+struct __simd_storage<_Tp, simd_abi::__scalar> {
+ _Tp __data;
+
+ _LIBCPP_HIDE_FROM_ABI _Tp __get([[maybe_unused]] size_t __idx) const noexcept {
+ _LIBCPP_ASSERT_UNCATEGORIZED(__idx == 0, "Index is out of bounds");
+ return __data;
+ }
+ _LIBCPP_HIDE_FROM_ABI void __set([[maybe_unused]] size_t __idx, _Tp __v) noexcept {
+ _LIBCPP_ASSERT_UNCATEGORIZED(__idx == 0, "Index is out of bounds");
+ __data = __v;
+ }
+};
+
+template <class _Tp>
+struct __mask_storage<_Tp, simd_abi::__scalar> : __simd_storage<bool, simd_abi::__scalar> {};
+
+template <class _Tp>
+struct __simd_operations<_Tp, simd_abi::__scalar> {
+ using _SimdStorage = __simd_storage<_Tp, simd_abi::__scalar>;
+ using _MaskStorage = __mask_storage<_Tp, simd_abi::__scalar>;
+
+ static _LIBCPP_HIDE_FROM_ABI _SimdStorage __broadcast(_Tp __v) noexcept { return {__v}; }
+
+ template <class _Generator>
+ static _LIBCPP_HIDE_FROM_ABI _SimdStorage __generate(_Generator&& __g) noexcept {
+ return {__g(std::integral_constant<size_t, 0>())};
+ }
+};
+
+template <class _Tp>
+struct __mask_operations<_Tp, simd_abi::__scalar> {
+ using _MaskStorage = __mask_storage<_Tp, simd_abi::__scalar>;
+
+ static _LIBCPP_HIDE_FROM_ABI _MaskStorage __broadcast(bool __v) noexcept { return {__v}; }
+};
+
+} // namespace parallelism_v2
+_LIBCPP_END_NAMESPACE_EXPERIMENTAL
+
+#endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+#endif // _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H