timshen updated this revision to Diff 129006.
timshen added a comment.

Implement memory_alignment.


https://reviews.llvm.org/D41845

Files:
  libcxx/include/experimental/simd

Index: libcxx/include/experimental/simd
===================================================================
--- libcxx/include/experimental/simd
+++ libcxx/include/experimental/simd
@@ -1061,10 +1061,18 @@
       "Element type should be vectorizable");
 };
 
-// TODO: implement it.
-template <class _Tp, class _Up = typename _Tp::value_type>
+template <class _SimdType, class _ValueType = typename _Tp::value_type>
 struct memory_alignment;
 
+// TODO: May extend this after implementing vector_aligned.
+template <class _Tp, class _Abi, class _Up>
+struct memory_alignment<simd<_Tp, _Abi>, _Up>
+    : std::integral_constant<size_t, alignof(simd<_Tp, _Abi>)> {};
+
+template <class _Tp, class _Abi>
+struct memory_alignment<simd_mask<_Tp, _Abi>, bool>
+    : std::integral_constant<size_t, alignof(simd_mask<_Tp, _Abi>)> {};
+
 #if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
 template <class _Tp, class _Abi = simd_abi::compatible<_Tp>>
 _LIBCPP_INLINE_VAR constexpr size_t simd_size_v = simd_size<_Tp, _Abi>::value;
@@ -1522,11 +1530,11 @@
   return __m.size();
 }
 
-bool all_of(bool __v) noexcept { return __v; }
-bool any_of(bool __v) noexcept { return __v; }
-bool none_of(bool __v) noexcept { return !__v; }
+bool all_of(bool __val) noexcept { return __val; }
+bool any_of(bool __val) noexcept { return __val; }
+bool none_of(bool __val) noexcept { return !__val; }
 bool some_of(bool) noexcept { return false; }
-int popcount(bool __v) noexcept { return __v; }
+int popcount(bool __val) noexcept { return __val; }
 int find_first_set(bool) noexcept { return 0; }
 int find_last_set(bool) noexcept { return 0; }
 
@@ -1681,9 +1689,9 @@
   template <class _Up,
             class = typename std::enable_if<__can_broadcast<_Up>()>::type>
   simd(_Up&& __rv) {
-    auto __v = static_cast<_Tp>(__rv);
+    auto __val = static_cast<_Tp>(__rv);
     for (size_t __i = 0; __i < size(); __i++) {
-      (*this)[__i] = __v;
+      (*this)[__i] = __val;
     }
   }
 
@@ -1987,9 +1995,9 @@
   simd_mask() = default;
 
   // broadcast constructor
-  explicit simd_mask(value_type __value) noexcept {
+  explicit simd_mask(value_type __val) noexcept {
     for (size_t __i = 0; __i < size(); __i++) {
-      (*this)[__i] = __value;
+      (*this)[__i] = __val;
     }
   }
 
@@ -2009,6 +2017,7 @@
   template <class _Flags, class = typename std::enable_if<
                               is_simd_flag_type<_Flags>::value>::type>
   simd_mask(const value_type* __buffer, _Flags) {
+    // TODO: optimize for overaligned flags
     for (size_t __i = 0; __i < size(); __i++) {
       (*this)[__i] = __buffer[__i];
     }
@@ -2024,6 +2033,7 @@
   template <class _Flags>
   typename std::enable_if<is_simd_flag_type<_Flags>::value>::type
   copy_to(value_type* __buffer, _Flags) const {
+    // TODO: optimize for overaligned flags
     for (size_t __i = 0; __i < size(); __i++) {
       __buffer[__i] = (*this)[__i];
     }
@@ -2093,6 +2103,7 @@
 template <class _Tp, class _Abi, class _Up, class _Flags>
 void __mask_copy_to(const simd<_Tp, _Abi>& __v, const simd_mask<_Tp, _Abi>& __m,
                     _Up* __buffer, _Flags) {
+  // TODO: optimize for overaligned flags
   for (size_t __i = 0; __i < __v.size(); __i++) {
     if (__m[__i]) {
       __buffer[__i] = static_cast<_Up>(__v[__i]);
@@ -2103,17 +2114,18 @@
 template <class _Tp, class _Abi, class _Up, class _Flags>
 void __mask_copy_to(const simd_mask<_Tp, _Abi>& __v,
                     const simd_mask<_Tp, _Abi>& __m, _Up* __buffer, _Flags) {
+  // TODO: optimize based on bool's bit pattern.
   for (size_t __i = 0; __i < __v.size(); __i++) {
     if (__m[__i]) {
       __buffer[__i] = static_cast<_Up>(__v[__i]);
     }
   }
 }
 
 template <class _Tp, class _Up, class _Flags>
-void __mask_copy_to(_Tp __v, bool __m, _Up* __buffer, _Flags) {
+void __mask_copy_to(_Tp __val, bool __m, _Up* __buffer, _Flags) {
   if (__m) {
-    *__buffer = static_cast<_Up>(__v);
+    *__buffer = static_cast<_Up>(__val);
   }
 }
 
@@ -2141,9 +2153,9 @@
 }
 
 template <class _Tp, class _Up, class _Flags>
-void __mask_copy_from(_Tp& __v, bool __m, const _Up* __buffer, _Flags) {
+void __mask_copy_from(_Tp& __val, bool __m, const _Up* __buffer, _Flags) {
   if (__m) {
-    __v = static_cast<_Tp>(*__buffer);
+    __val = static_cast<_Tp>(*__buffer);
   }
 }
 
@@ -2493,6 +2505,8 @@
       __w.__v_, __w.__m_));
 }
 
+// TODO: Implement <cmath> functions for simd.
+
 _LIBCPP_END_NAMESPACE_EXPERIMENTAL_SIMD
 
 #endif /* _LIBCPP_EXPERIMENTAL_SIMD */
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to