vir-simd 0.4.189
Parallelism TS 2 extensions and simd fallback implementation
Loading...
Searching...
No Matches
simd_bitset.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_BITSET_H_
7#define VIR_SIMD_BITSET_H_
8
9#include <bitset>
10#include "simd.h"
11#include "detail.h"
12
13namespace vir
14{
15 template <typename T, typename A>
16 std::bitset<stdx::simd_size_v<T, A>>
17 to_bitset(const stdx::simd_mask<T, A>& k)
18 {
19#if VIR_GLIBCXX_STDX_SIMD
20 return k.__to_bitset();
21#else
22 if constexpr (stdx::simd_size_v<T, A> == 1)
23 return k[0];
24 else
25 {
26 constexpr int N = stdx::simd_size_v<T, A>;
27 std::bitset<N> bits;
28 for (int i = 0; i < N; ++i)
29 bits[i] = k[i];
30 return bits;
31 }
32#endif
33 }
34
35 template <typename M>
36 std::enable_if_t<stdx::is_simd_mask_v<M>, M>
37 to_simd_mask(std::bitset<M::size()> bits)
38 {
39#if VIR_GLIBCXX_STDX_SIMD
40 return M::__from_bitset(bits);
41#else
42 if constexpr (M::size() == 1)
43 return M(bits[0]);
44 else
45 return M([bits](size_t i) -> bool { return bits[i]; });
46#endif
47 }
48
49 template <typename T, typename A>
50 auto
51 to_simd_mask(std::bitset<stdx::simd_size_v<T, A>> bits)
52 -> decltype(to_simd_mask<stdx::simd_mask<T, A>>(bits))
53 { return to_simd_mask<stdx::simd_mask<T, A>>(bits); }
54
55 template <typename T, std::size_t N>
56 auto
57 to_simd_mask(std::bitset<N> bits)
58 -> decltype(to_simd_mask<stdx::simd_mask<T, stdx::simd_abi::deduce_t<T, N>>>(bits))
59 { return to_simd_mask<stdx::simd_mask<T, stdx::simd_abi::deduce_t<T, N>>>(bits); }
60}
61
62#endif // VIR_SIMD_BITSET_H_
This namespace collects libraries and tools authored by Matthias Kretz.
Definition constexpr_wrapper.h:21