[libcxx-commits] [PATCH] D144362: [libcxx] <experimental/simd> Add ABI tags, class template simd/simd_mask implementations. Add related simd traits and tests.

Nikolas Klauser via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Fri Jun 23 19:14:31 PDT 2023


philnik added a comment.

I've applied for patch locally and reworked the instantiation logic a bit. This is my solution:

name=test_utils.h
  //===----------------------------------------------------------------------===//
  //
  // 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 <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<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<1>());
  
      instantiate_with_n<T>(std::make_index_sequence<max_simd_size - 1>{});
    }
  };
  
  template <template <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

name=is_abi_tag.pass.cpp
  //===----------------------------------------------------------------------===//
  //
  // 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"
  #include <experimental/simd>
  
  namespace ex = std::experimental::parallelism_v2;
  
  class EmptyEntry {};
  
  template <std::size_t N>
  struct Test {
    template <class SimdAbi>
    void operator()() {
      static_assert(ex::is_abi_tag<SimdAbi>::value);
  
      static_assert(!ex::is_abi_tag<EmptyEntry>::value);
      static_assert(!ex::is_abi_tag<ex::simd< EmptyEntry, SimdAbi>>::value);
      static_assert(!ex::is_abi_tag<ex::simd_mask< EmptyEntry, SimdAbi>>::value);
  
      static_assert(ex::is_abi_tag_v<SimdAbi>);
  
      static_assert(!ex::is_abi_tag_v<EmptyEntry>);
      static_assert(!ex::is_abi_tag_v<ex::simd< EmptyEntry, SimdAbi>>);
      static_assert(!ex::is_abi_tag_v<ex::simd_mask< EmptyEntry, SimdAbi>>);
    }
  };
  
  int main(int, char**) {
    test_all_simd_abi<Test>();
    return 0;
  }

I think this version is quite a bit easier to follow. WDYT?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D144362/new/

https://reviews.llvm.org/D144362



More information about the libcxx-commits mailing list