[libcxx-commits] [libcxx] 0e30dd4 - [libcxx] <experimental/simd> Add ABI tags, class template simd/simd_mask implementations. Add related simd traits and tests.
via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Sep 11 20:42:00 PDT 2023
Author: Zhangyin
Date: 2023-09-12T11:41:40+08:00
New Revision: 0e30dd44adc9e3e19a57d856cbb01efc25b9b79d
URL: https://github.com/llvm/llvm-project/commit/0e30dd44adc9e3e19a57d856cbb01efc25b9b79d
DIFF: https://github.com/llvm/llvm-project/commit/0e30dd44adc9e3e19a57d856cbb01efc25b9b79d.diff
LOG: [libcxx] <experimental/simd> Add ABI tags, class template simd/simd_mask implementations. Add related simd traits and tests.
[libcxx] <experimental/simd> Add ABI tags, class template simd/simd_mask implementations.
[libcxx] <experimental/simd> Add traits is_abi_tag[_v], is_simd[_v] and is_simd_mask[_v].
[libcxx] <experimental/simd> Add related tests.
Reviewed By: #libc, philnik
Differential Revision: https://reviews.llvm.org/D144362
Added:
libcxx/include/experimental/__simd/abi_tag.h
libcxx/include/experimental/__simd/scalar.h
libcxx/include/experimental/__simd/simd.h
libcxx/include/experimental/__simd/simd_mask.h
libcxx/include/experimental/__simd/traits.h
libcxx/include/experimental/__simd/vec_ext.h
libcxx/test/std/experimental/simd/simd.traits/is_abi_tag.pass.cpp
libcxx/test/std/experimental/simd/simd.traits/is_simd.pass.cpp
libcxx/test/std/experimental/simd/simd.traits/is_simd_mask.pass.cpp
libcxx/test/std/experimental/simd/test_utils.h
Modified:
libcxx/docs/Status/ParallelismProjects.csv
libcxx/include/CMakeLists.txt
libcxx/include/experimental/__config
libcxx/include/experimental/simd
libcxx/test/libcxx/transitive_includes/cxx03.csv
libcxx/test/libcxx/transitive_includes/cxx11.csv
libcxx/test/libcxx/transitive_includes/cxx14.csv
libcxx/test/libcxx/transitive_includes/cxx17.csv
libcxx/test/libcxx/transitive_includes/cxx20.csv
libcxx/test/libcxx/transitive_includes/cxx23.csv
libcxx/test/libcxx/transitive_includes/cxx26.csv
Removed:
################################################################################
diff --git a/libcxx/docs/Status/ParallelismProjects.csv b/libcxx/docs/Status/ParallelismProjects.csv
index de59ad601b9a047..5b5584647a3a9f4 100644
--- a/libcxx/docs/Status/ParallelismProjects.csv
+++ b/libcxx/docs/Status/ParallelismProjects.csv
@@ -3,10 +3,19 @@ Section,Description,Dependencies,Assignee,Complete
| `[parallel.execpol] <https://wg21.link/N4808>`_, "Execution policies", None, unassigned, |Not Started|
| `[parallel.alg] <https://wg21.link/N4808>`_, "Parallel algorithms", None, unassigned, |Not Started|
| `[parallel.taskblock] <https://wg21.link/N4808>`_, "Task Block", None, unassigned, |Not Started|
-| `[parallel.simd.abi] <https://wg21.link/N4808>`_, "simd ABI tags", None, Yin Zhang, |In Progress|
-| `[parallel.simd.traits] <https://wg21.link/N4808>`_, "simd type traits", None, Yin Zhang, |In Progress|
+| `[parallel.simd.abi] <https://wg21.link/N4808>`_, "`simd ABI tags <https://reviews.llvm.org/D144362>`_", [parallel.simd.class] [parallel.simd.mask.class] declarations and alias, Yin Zhang, |Complete|
+| `[parallel.simd.traits] <https://wg21.link/N4808>`_, "`simd type traits is_abi_tag[_v] <https://reviews.llvm.org/D144362>`_", [parallel.simd.abi], Yin Zhang, |Complete|
+| `[parallel.simd.traits] <https://wg21.link/N4808>`_, "`simd type traits is_simd[_v] <https://reviews.llvm.org/D144362>`_", [parallel.simd.class] declaration and alias, Yin Zhang, |Complete|
+| `[parallel.simd.traits] <https://wg21.link/N4808>`_, "`simd type traits is_simd_mask[_v] <https://reviews.llvm.org/D144362>`_", [parallel.simd.mask.class] declaration and alias, Yin Zhang, |Complete|
+| `[parallel.simd.traits] <https://wg21.link/N4808>`_, "simd type traits is_simd_flag_type", None, Yin Zhang, |In Progress|
+| `[parallel.simd.traits] <https://wg21.link/N4808>`_, "simd type traits simd_size", None, Yin Zhang, |In Progress|
+| `[parallel.simd.traits] <https://wg21.link/N4808>`_, "simd type traits memory_alignment", None, Yin Zhang, |In Progress|
+| `[parallel.simd.traits] <https://wg21.link/N4808>`_, "simd type traits rebind_simd", None, Yin Zhang, |In Progress|
+| `[parallel.simd.traits] <https://wg21.link/N4808>`_, "simd type traits resize_simd", None, Yin Zhang, |In Progress|
| `[parallel.simd.whereexpr] <https://wg21.link/N4808>`_, "Where expression class templates", None, Yin Zhang, |In Progress|
-| `[parallel.simd.class] <https://wg21.link/N4808>`_, "Class template simd", None, Yin Zhang, |In Progress|
+| `[parallel.simd.class] <https://wg21.link/N4808>`_, "`Class template simd declaration and alias <https://reviews.llvm.org/D144362>`_", [parallel.simd.abi], Yin Zhang, |Complete|
+| `[parallel.simd.class] <https://wg21.link/N4808>`_, "Class template simd implementation", None, Yin Zhang, |In Progress|
| `[parallel.simd.nonmembers] <https://wg21.link/N4808>`_, "simd non-member operations", None, Yin Zhang, |In Progress|
-| `[parallel.simd.mask.class] <https://wg21.link/N4808>`_, "Class template simd_mask", None, Yin Zhang, |In Progress|
+| `[parallel.simd.mask.class] <https://wg21.link/N4808>`_, "`Class template simd_mask declaration and alias <https://reviews.llvm.org/D144362>`_", [parallel.simd.abi], Yin Zhang, |Complete|
+| `[parallel.simd.mask.class] <https://wg21.link/N4808>`_, "Class template simd_mask implementation", None, Yin Zhang, |In Progress|
| `[parallel.simd.mask.nonmembers] <https://wg21.link/N4808>`_, "simd_mask non-member operations", None, Yin Zhang, |In Progress|
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index dd00636fcf0b7c5..e9bb73d66b1024a 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -903,6 +903,12 @@ set(files
expected
experimental/__config
experimental/__memory
+ experimental/__simd/abi_tag.h
+ experimental/__simd/scalar.h
+ experimental/__simd/simd.h
+ experimental/__simd/simd_mask.h
+ experimental/__simd/traits.h
+ experimental/__simd/vec_ext.h
experimental/deque
experimental/forward_list
experimental/iterator
diff --git a/libcxx/include/experimental/__config b/libcxx/include/experimental/__config
index 28a431e3564e5b8..65227c8b4052049 100644
--- a/libcxx/include/experimental/__config
+++ b/libcxx/include/experimental/__config
@@ -32,4 +32,11 @@
#define _LIBCPP_END_NAMESPACE_LFTS_PMR _LIBCPP_END_NAMESPACE_LFTS }
#define _VSTD_LFTS_PMR _VSTD_LFTS::pmr
+// TODO: support more targets
+#if defined(__AVX__)
+#define _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES 32
+#else
+#define _LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES 16
+#endif
+
#endif
diff --git a/libcxx/include/experimental/__simd/abi_tag.h b/libcxx/include/experimental/__simd/abi_tag.h
new file mode 100644
index 000000000000000..a9d51c0683b1dc8
--- /dev/null
+++ b/libcxx/include/experimental/__simd/abi_tag.h
@@ -0,0 +1,54 @@
+// -*- 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_ABI_TAG_H
+#define _LIBCPP_EXPERIMENTAL___SIMD_ABI_TAG_H
+
+#include <experimental/__simd/scalar.h>
+#include <experimental/__simd/vec_ext.h>
+
+#if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+
+_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
+inline namespace parallelism_v2 {
+namespace simd_abi {
+
+using scalar = __scalar;
+
+// TODO: make this platform dependent
+template <int _Np>
+using fixed_size = __vec_ext<_Np>;
+
+template <class _Tp>
+inline constexpr int max_fixed_size = 32;
+
+// TODO: make this platform dependent
+template <class _Tp>
+using compatible = __vec_ext<16 / sizeof(_Tp)>;
+
+// TODO: make this platform dependent
+template <class _Tp>
+using native = __vec_ext<_LIBCPP_NATIVE_SIMD_WIDTH_IN_BYTES / sizeof(_Tp)>;
+
+// TODO: make this platform dependent
+template <class _Tp, size_t _Np, class... _Abis>
+struct deduce {
+ using type = fixed_size<_Np>;
+};
+
+// TODO: make this platform dependent
+template <class _Tp, size_t _Np, class... _Abis>
+using deduce_t = typename deduce<_Tp, _Np, _Abis...>::type;
+
+} // namespace simd_abi
+} // namespace parallelism_v2
+_LIBCPP_END_NAMESPACE_EXPERIMENTAL
+
+#endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+#endif // _LIBCPP_EXPERIMENTAL___SIMD_ABI_TAG_H
diff --git a/libcxx/include/experimental/__simd/scalar.h b/libcxx/include/experimental/__simd/scalar.h
new file mode 100644
index 000000000000000..d96299e658a0ff2
--- /dev/null
+++ b/libcxx/include/experimental/__simd/scalar.h
@@ -0,0 +1,29 @@
+// -*- 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>
+
+#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
+} // namespace parallelism_v2
+_LIBCPP_END_NAMESPACE_EXPERIMENTAL
+
+#endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+#endif // _LIBCPP_EXPERIMENTAL___SIMD_SCALAR_H
diff --git a/libcxx/include/experimental/__simd/simd.h b/libcxx/include/experimental/__simd/simd.h
new file mode 100644
index 000000000000000..2c38c7c6fc63548
--- /dev/null
+++ b/libcxx/include/experimental/__simd/simd.h
@@ -0,0 +1,35 @@
+// -*- 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_SIMD_H
+#define _LIBCPP_EXPERIMENTAL___SIMD_SIMD_H
+
+#include <experimental/__simd/abi_tag.h>
+
+#if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+
+_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
+inline namespace parallelism_v2 {
+
+// class template simd [simd.class]
+// TODO: implement simd class
+template <class _Tp, class _Abi = simd_abi::compatible<_Tp>>
+class simd;
+
+template <class _Tp>
+using native_simd = simd<_Tp, simd_abi::native<_Tp>>;
+
+template <class _Tp, int _Np>
+using fixed_size_simd = simd<_Tp, simd_abi::fixed_size<_Np>>;
+
+} // namespace parallelism_v2
+_LIBCPP_END_NAMESPACE_EXPERIMENTAL
+
+#endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+#endif // _LIBCPP_EXPERIMENTAL___SIMD_SIMD_H
diff --git a/libcxx/include/experimental/__simd/simd_mask.h b/libcxx/include/experimental/__simd/simd_mask.h
new file mode 100644
index 000000000000000..fae40b93f35e68f
--- /dev/null
+++ b/libcxx/include/experimental/__simd/simd_mask.h
@@ -0,0 +1,35 @@
+// -*- 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_SIMD_MASK_H
+#define _LIBCPP_EXPERIMENTAL___SIMD_SIMD_MASK_H
+
+#include <experimental/__simd/abi_tag.h>
+
+#if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+
+_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
+inline namespace parallelism_v2 {
+
+// class template simd_mask [simd.mask.class]
+// TODO: implement simd_mask class
+template <class _Tp, class _Abi = simd_abi::compatible<_Tp>>
+class simd_mask;
+
+template <class _Tp>
+using native_simd_mask = simd_mask<_Tp, simd_abi::native<_Tp>>;
+
+template <class _Tp, int _Np>
+using fixed_size_simd_mask = simd_mask<_Tp, simd_abi::fixed_size<_Np>>;
+
+} // namespace parallelism_v2
+_LIBCPP_END_NAMESPACE_EXPERIMENTAL
+
+#endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+#endif // _LIBCPP_EXPERIMENTAL___SIMD_SIMD_MASK_H
diff --git a/libcxx/include/experimental/__simd/traits.h b/libcxx/include/experimental/__simd/traits.h
new file mode 100644
index 000000000000000..475946c138ee95b
--- /dev/null
+++ b/libcxx/include/experimental/__simd/traits.h
@@ -0,0 +1,57 @@
+// -*- 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_TRAITS_H
+#define _LIBCPP_EXPERIMENTAL___SIMD_TRAITS_H
+
+#include <experimental/__simd/abi_tag.h>
+#include <experimental/__simd/simd.h>
+#include <experimental/__simd/simd_mask.h>
+
+#if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+
+_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
+inline namespace parallelism_v2 {
+
+// traits [simd.traits]
+template <class _Tp>
+inline constexpr bool is_abi_tag_v = false;
+
+template <>
+inline constexpr bool is_abi_tag_v<simd_abi::__scalar> = true;
+
+template <int _Np>
+inline constexpr bool is_abi_tag_v<simd_abi::__vec_ext<_Np>> = _Np > 0 && _Np <= 32;
+
+template <class _Tp>
+struct is_abi_tag : bool_constant<is_abi_tag_v<_Tp>> {};
+
+template <class _Tp>
+inline constexpr bool is_simd_v = false;
+
+template <class _Tp, class _Abi>
+inline constexpr bool is_simd_v<simd<_Tp, _Abi>> = true;
+
+template <class _Tp>
+struct is_simd : bool_constant<is_simd_v<_Tp>> {};
+
+template <class _Tp>
+inline constexpr bool is_simd_mask_v = false;
+
+template <class _Tp, class _Abi>
+inline constexpr bool is_simd_mask_v<simd_mask<_Tp, _Abi>> = true;
+
+template <class _Tp>
+struct is_simd_mask : bool_constant<is_simd_mask_v<_Tp>> {};
+
+} // namespace parallelism_v2
+_LIBCPP_END_NAMESPACE_EXPERIMENTAL
+
+#endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+#endif // _LIBCPP_EXPERIMENTAL___SIMD_TRAITS_H
diff --git a/libcxx/include/experimental/__simd/vec_ext.h b/libcxx/include/experimental/__simd/vec_ext.h
new file mode 100644
index 000000000000000..4ece1dc2cda7983
--- /dev/null
+++ b/libcxx/include/experimental/__simd/vec_ext.h
@@ -0,0 +1,30 @@
+// -*- 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_VEC_EXT_H
+#define _LIBCPP_EXPERIMENTAL___SIMD_VEC_EXT_H
+
+#include <cstddef>
+
+#if _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+
+_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
+inline namespace parallelism_v2 {
+namespace simd_abi {
+template <int _Np>
+struct __vec_ext {
+ static constexpr size_t __simd_size = _Np;
+};
+
+} // namespace simd_abi
+} // namespace parallelism_v2
+_LIBCPP_END_NAMESPACE_EXPERIMENTAL
+
+#endif // _LIBCPP_STD_VER >= 17 && defined(_LIBCPP_ENABLE_EXPERIMENTAL)
+#endif // _LIBCPP_EXPERIMENTAL___SIMD_VEC_EXT_H
diff --git a/libcxx/include/experimental/simd b/libcxx/include/experimental/simd
index 90e9028ceb3512f..59f212dce88d0da 100644
--- a/libcxx/include/experimental/simd
+++ b/libcxx/include/experimental/simd
@@ -10,6 +10,60 @@
#ifndef _LIBCPP_EXPERIMENTAL_SIMD
#define _LIBCPP_EXPERIMENTAL_SIMD
+/*
+ experimental/simd synopsis
+
+namespace std::experimental {
+inline namespace parallelism_v2 {
+ namespace simd_abi {
+ using scalar = see below;
+ template<int N> using fixed_size = see below;
+ template<class T> inline constexpr int max_fixed_size = implementation-defined;
+ template<class T> using compatible = implementation-defined;
+ template<class T> using native = implementation-defined;
+
+ template<class T, size_t N, class... Abis> struct deduce { using type = see below; };
+ template<class T, size_t N, class... Abis> using deduce_t =
+ typename deduce<T, N, Abis...>::type;
+ } // namespace simd_abi
+
+ // class template simd [simd.class]
+ template <class T, class Abi = simd_abi::compatible<T>> class simd;
+ template <class T> using native_simd = simd<T, simd_abi::native<T>>;
+ template <class T, int N> using fixed_size_simd = simd<T, simd_abi::fixed_size<N>>;
+
+ // class template simd_mask [simd.mask.class]
+ template <class T, class Abi = simd_abi::compatible<T>> class simd_mask;
+ template <class T> using native_simd_mask = simd_mask<T, simd_abi::native<T>>;
+ template <class T, int N> using fixed_size_simd_mask = simd_mask<T, simd_abi::fixed_size<N>>;
+
+ // traits [simd.traits]
+ template<class T> struct is_abi_tag;
+ template<class T> inline constexpr bool is_abi_tag_v = is_abi_tag<T>::value;
+
+ template <class T> struct is_simd;
+ template <class T> inline constexpr bool is_simd_v = is_simd<T>::value;
+
+ template <class T> struct is_simd_mask;
+ template <class T> inline constexpr bool is_simd_mask_v = is_simd_mask<T>::value;
+
+} // namespace parallelism_v2
+} // namespace std::experimental
+
+*/
+
#include <__assert> // all public C++ headers provide the assertion handler
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+# pragma GCC system_header
+#endif
+
+#include <experimental/__config>
+#include <experimental/__simd/abi_tag.h>
+#include <experimental/__simd/scalar.h>
+#include <experimental/__simd/simd.h>
+#include <experimental/__simd/simd_mask.h>
+#include <experimental/__simd/traits.h>
+#include <experimental/__simd/vec_ext.h>
+
#endif /* _LIBCPP_EXPERIMENTAL_SIMD */
diff --git a/libcxx/test/libcxx/transitive_includes/cxx03.csv b/libcxx/test/libcxx/transitive_includes/cxx03.csv
index 17a3749d7b87f51..004ea6f78194341 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx03.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx03.csv
@@ -264,6 +264,7 @@ experimental/regex experimental/string
experimental/regex regex
experimental/set experimental/memory_resource
experimental/set set
+experimental/simd cstddef
experimental/string experimental/memory_resource
experimental/string string
experimental/unordered_map algorithm
diff --git a/libcxx/test/libcxx/transitive_includes/cxx11.csv b/libcxx/test/libcxx/transitive_includes/cxx11.csv
index 0176ceb54ec23d2..4b40ea668ac13a4 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx11.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx11.csv
@@ -265,6 +265,7 @@ experimental/regex experimental/string
experimental/regex regex
experimental/set experimental/memory_resource
experimental/set set
+experimental/simd cstddef
experimental/string experimental/memory_resource
experimental/string string
experimental/unordered_map algorithm
diff --git a/libcxx/test/libcxx/transitive_includes/cxx14.csv b/libcxx/test/libcxx/transitive_includes/cxx14.csv
index 7513c6b1741f84e..98e5cd784273a70 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx14.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx14.csv
@@ -265,6 +265,7 @@ experimental/regex experimental/string
experimental/regex regex
experimental/set experimental/memory_resource
experimental/set set
+experimental/simd cstddef
experimental/string experimental/memory_resource
experimental/string string
experimental/type_traits initializer_list
diff --git a/libcxx/test/libcxx/transitive_includes/cxx17.csv b/libcxx/test/libcxx/transitive_includes/cxx17.csv
index 7513c6b1741f84e..98e5cd784273a70 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx17.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx17.csv
@@ -265,6 +265,7 @@ experimental/regex experimental/string
experimental/regex regex
experimental/set experimental/memory_resource
experimental/set set
+experimental/simd cstddef
experimental/string experimental/memory_resource
experimental/string string
experimental/type_traits initializer_list
diff --git a/libcxx/test/libcxx/transitive_includes/cxx20.csv b/libcxx/test/libcxx/transitive_includes/cxx20.csv
index 3794057ebfa224e..2b7feb5d06cde69 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx20.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx20.csv
@@ -271,6 +271,7 @@ experimental/regex experimental/string
experimental/regex regex
experimental/set experimental/memory_resource
experimental/set set
+experimental/simd cstddef
experimental/string experimental/memory_resource
experimental/string string
experimental/type_traits initializer_list
diff --git a/libcxx/test/libcxx/transitive_includes/cxx23.csv b/libcxx/test/libcxx/transitive_includes/cxx23.csv
index 19d43136bc006fe..d977ebbaf44625a 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx23.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx23.csv
@@ -184,6 +184,7 @@ experimental/regex experimental/string
experimental/regex regex
experimental/set experimental/memory_resource
experimental/set set
+experimental/simd cstddef
experimental/string experimental/memory_resource
experimental/string string
experimental/type_traits initializer_list
diff --git a/libcxx/test/libcxx/transitive_includes/cxx26.csv b/libcxx/test/libcxx/transitive_includes/cxx26.csv
index 19d43136bc006fe..d977ebbaf44625a 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx26.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx26.csv
@@ -184,6 +184,7 @@ experimental/regex experimental/string
experimental/regex regex
experimental/set experimental/memory_resource
experimental/set set
+experimental/simd cstddef
experimental/string experimental/memory_resource
experimental/string string
experimental/type_traits initializer_list
diff --git a/libcxx/test/std/experimental/simd/simd.traits/is_abi_tag.pass.cpp b/libcxx/test/std/experimental/simd/simd.traits/is_abi_tag.pass.cpp
new file mode 100644
index 000000000000000..7d1c69fad047846
--- /dev/null
+++ b/libcxx/test/std/experimental/simd/simd.traits/is_abi_tag.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14
+
+// <experimental/simd>
+//
+// [simd.traits]
+// template <class T> struct is_abi_tag;
+// template <class T> inline constexpr bool ex::is_abi_tag_v = ex::is_abi_tag<T>::value;
+
+#include "../test_utils.h"
+
+namespace ex = std::experimental::parallelism_v2;
+
+template <class T, std::size_t N>
+struct CheckIsAbiTag {
+ template <class SimdAbi>
+ void operator()() {
+ static_assert(ex::is_abi_tag<SimdAbi>::value);
+
+ static_assert(!ex::is_abi_tag<T>::value);
+ static_assert(!ex::is_abi_tag<ex::simd<T, SimdAbi>>::value);
+ static_assert(!ex::is_abi_tag<ex::simd_mask<T, SimdAbi>>::value);
+
+ static_assert(ex::is_abi_tag_v<SimdAbi>);
+
+ static_assert(!ex::is_abi_tag_v<T>);
+ static_assert(!ex::is_abi_tag_v<ex::simd<T, SimdAbi>>);
+ static_assert(!ex::is_abi_tag_v<ex::simd_mask<T, SimdAbi>>);
+ }
+};
+
+int main(int, char**) {
+ test_all_simd_abi<CheckIsAbiTag>();
+ return 0;
+}
\ No newline at end of file
diff --git a/libcxx/test/std/experimental/simd/simd.traits/is_simd.pass.cpp b/libcxx/test/std/experimental/simd/simd.traits/is_simd.pass.cpp
new file mode 100644
index 000000000000000..44642ffce06bfc0
--- /dev/null
+++ b/libcxx/test/std/experimental/simd/simd.traits/is_simd.pass.cpp
@@ -0,0 +1,41 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14
+
+// <experimental/simd>
+//
+// [simd.traits]
+// template <class T> struct ex::is_simd;
+// template <class T> inline constexpr bool ex::is_simd_v =
+// ex::is_simd<T>::value;
+
+#include "../test_utils.h"
+
+namespace ex = std::experimental::parallelism_v2;
+
+template <class T, std::size_t>
+struct CheckIsSimd {
+ template <class SimdAbi>
+ void operator()() {
+ static_assert(ex::is_simd<ex::simd<T, SimdAbi>>::value);
+
+ static_assert(!ex::is_simd<T>::value);
+ static_assert(!ex::is_simd<ex::simd_mask<T, SimdAbi>>::value);
+
+ static_assert(ex::is_simd_v<ex::simd<T, SimdAbi>>);
+
+ static_assert(!ex::is_simd_v<T>);
+ static_assert(!ex::is_simd_v<ex::simd_mask<T, SimdAbi>>);
+ }
+};
+
+int main(int, char**) {
+ test_all_simd_abi<CheckIsSimd>();
+ return 0;
+}
diff --git a/libcxx/test/std/experimental/simd/simd.traits/is_simd_mask.pass.cpp b/libcxx/test/std/experimental/simd/simd.traits/is_simd_mask.pass.cpp
new file mode 100644
index 000000000000000..810ece31cf99375
--- /dev/null
+++ b/libcxx/test/std/experimental/simd/simd.traits/is_simd_mask.pass.cpp
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14
+
+// <experimental/simd>
+//
+// [simd.traits]
+// template <class T> struct ex::is_simd_mask;
+// template <class T> inline constexpr bool ex::is_simd_mask_v = ex::is_simd_mask<T>::value;
+
+#include "../test_utils.h"
+
+namespace ex = std::experimental::parallelism_v2;
+
+template <class T, std::size_t>
+struct CheckIsSimdMask {
+ template <class SimdAbi>
+ void operator()() {
+ static_assert(ex::is_simd_mask<ex::simd_mask<T, SimdAbi>>::value);
+
+ static_assert(!ex::is_simd_mask<T>::value);
+ static_assert(!ex::is_simd_mask<ex::simd<T, SimdAbi>>::value);
+
+ static_assert(ex::is_simd_mask_v<ex::simd_mask<T, SimdAbi>>);
+
+ static_assert(!ex::is_simd_mask_v<T>);
+ static_assert(!ex::is_simd_mask_v<ex::simd<T, SimdAbi>>);
+ }
+};
+
+int main(int, char**) {
+ test_all_simd_abi<CheckIsSimdMask>();
+ return 0;
+}
diff --git a/libcxx/test/std/experimental/simd/test_utils.h b/libcxx/test/std/experimental/simd/test_utils.h
new file mode 100644
index 000000000000000..11a678b76637c92
--- /dev/null
+++ b/libcxx/test/std/experimental/simd/test_utils.h
@@ -0,0 +1,45 @@
+//===----------------------------------------------------------------------===//
+//
+// 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 TEST_UTIL_H
+#define TEST_UTIL_H
+
+#include <utility>
+#include <experimental/simd>
+#include "type_algorithms.h"
+
+namespace ex = std::experimental::parallelism_v2;
+
+constexpr std::size_t max_simd_size = 32;
+
+template <template <class T, std::size_t N> class F>
+struct TestAllSimdAbiFunctor {
+ template <class T, std::size_t N>
+ using sized_abis = types::type_list<ex::simd_abi::fixed_size<N>, ex::simd_abi::deduce_t<T, N>>;
+
+ template <class T, std::size_t... Ns>
+ void instantiate_with_n(std::index_sequence<Ns...>) {
+ (types::for_each(sized_abis<T, Ns + 1>{}, F<T, Ns + 1>{}), ...);
+ }
+
+ template <class T>
+ void operator()() {
+ using abis = types::type_list<ex::simd_abi::scalar, ex::simd_abi::native<T>, ex::simd_abi::compatible<T>>;
+ types::for_each(abis{}, F<T, 1>());
+
+ instantiate_with_n<T>(std::make_index_sequence<max_simd_size - 1>{});
+ }
+};
+
+template <template <class T, std::size_t N> class Func>
+void test_all_simd_abi() {
+ using arithmetic_no_bool_types = types::concatenate_t<types::integer_types, types::floating_point_types>;
+ types::for_each(arithmetic_no_bool_types(), TestAllSimdAbiFunctor<Func>());
+}
+
+#endif // TEST_UTIL_H
More information about the libcxx-commits
mailing list