vir-simd 0.4.189
Parallelism TS 2 extensions and simd fallback implementation
Loading...
Searching...
No Matches
simd_resize.h
1/* SPDX-License-Identifier: LGPL-3.0-or-later */
2/* Copyright © 2022–2024 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
3 * Matthias Kretz <m.kretz@gsi.de>
4 */
5
6#ifndef VIR_SIMD_RESIZE_H
7#define VIR_SIMD_RESIZE_H
8
9#include "simd.h"
10#include "detail.h"
11
12namespace vir
13{
14 template <int N, typename T, typename A>
15 constexpr vir::detail::deduced_simd<T, N>
16 simd_resize(const stdx::simd<T, A>& x)
17 {
18 constexpr int xn = stdx::simd_size_v<T, A>;
19 return vir::detail::deduced_simd<T, N>([&x](auto i) {
20 if constexpr (i < xn)
21 return x[i];
22 else
23 return T();
24 });
25 }
26
27 template <int N, typename T, typename A>
28 constexpr vir::detail::deduced_simd_mask<T, N>
29 simd_resize(const stdx::simd_mask<T, A>& x)
30 {
31 constexpr int xn = stdx::simd_size_v<T, A>;
32 return vir::detail::deduced_simd_mask<T, N>([&x](auto i) {
33 if constexpr (i < xn)
34 return x[i];
35 else
36 return false;
37 });
38 }
39
40 template <typename V, typename A>
41 constexpr std::enable_if_t<stdx::is_simd_v<V>, V>
42 simd_size_cast(const stdx::simd<typename V::value_type, A>& x)
43 {
44 using T = typename V::value_type;
45 constexpr int xn = stdx::simd_size_v<T, A>;
46 return V([&x](auto i) {
47 if constexpr (i < xn)
48 return x[i];
49 else
50 return false;
51 });
52 }
53
54 template <typename M, typename A>
55 constexpr std::enable_if_t<stdx::is_simd_mask_v<M>, M>
56 simd_size_cast(const stdx::simd_mask<typename M::simd_type::value_type, A>& x)
57 {
58#if VIR_GLIBCXX_STDX_SIMD
59 return std::experimental::parallelism_v2::__proposed::resizing_simd_cast<M>(x);
60#else
61 using T = typename M::simd_type::value_type;
62 constexpr int xn = stdx::simd_size_v<T, A>;
63 return M([&x](auto i) {
64 if constexpr (i < xn)
65 return x[i];
66 else
67 return false;
68 });
69#endif
70 }
71}
72
73#endif // VIR_SIMD_RESIZE_H
This namespace collects libraries and tools authored by Matthias Kretz.
Definition constexpr_wrapper.h:21