vir-simd 0.4.189
Parallelism TS 2 extensions and simd fallback implementation
Loading...
Searching...
No Matches
simd_float_ops.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_FLOAT_OPS_H_
7#define VIR_SIMD_FLOAT_OPS_H_
8
9#include "detail.h"
10#include <type_traits>
11
12namespace vir
13{
14 namespace simd_float_ops
15 {
16 template <typename T, typename A>
17 constexpr inline stdx::simd<T, A>
18 operator&(const stdx::simd<detail::FloatingPoint<T>, A> a,
19 const stdx::simd<T, A> b) noexcept
20 {
21 if constexpr (sizeof(T) <= sizeof(long long))
22 {
23 using V = stdx::simd<T, A>;
24 using I = stdx::rebind_simd_t<meta::as_unsigned_t<T>, V>;
25 return detail::bit_cast<V>(detail::bit_cast<I>(a) & detail::bit_cast<I>(b));
26 }
27 else
28 return stdx::simd<T, A>([&](size_t i) {
29 using I = meta::as_unsigned_t<T>;
30 return detail::bit_cast<T>(detail::bit_cast<I>(a[i]) & detail::bit_cast<I>(b[i]));
31 });
32 }
33
34 template <typename T, typename A>
35 constexpr inline stdx::simd<T, A>
36 operator|(const stdx::simd<detail::FloatingPoint<T>, A> a,
37 const stdx::simd<T, A> b) noexcept
38 {
39 if constexpr (sizeof(T) <= sizeof(long long))
40 {
41 using V = stdx::simd<T, A>;
42 using I = stdx::rebind_simd_t<meta::as_unsigned_t<T>, V>;
43 return detail::bit_cast<V>(detail::bit_cast<I>(a) | detail::bit_cast<I>(b));
44 }
45 else
46 return stdx::simd<T, A>([&](size_t i) {
47 using I = meta::as_unsigned_t<T>;
48 return detail::bit_cast<T>(detail::bit_cast<I>(a[i]) | detail::bit_cast<I>(b[i]));
49 });
50 }
51
52 template <typename T, typename A>
53 constexpr inline stdx::simd<T, A>
54 operator^(const stdx::simd<detail::FloatingPoint<T>, A> a,
55 const stdx::simd<T, A> b) noexcept
56 {
57 if constexpr (sizeof(T) <= sizeof(long long))
58 {
59 using V = stdx::simd<T, A>;
60 using I = stdx::rebind_simd_t<meta::as_unsigned_t<T>, V>;
61 return detail::bit_cast<V>(detail::bit_cast<I>(a) ^ detail::bit_cast<I>(b));
62 }
63 else
64 return stdx::simd<T, A>([&](size_t i) {
65 using I = meta::as_unsigned_t<T>;
66 return detail::bit_cast<T>(detail::bit_cast<I>(a[i]) ^ detail::bit_cast<I>(b[i]));
67 });
68 }
69 }
70}
71
72#endif // VIR_SIMD_FLOAT_OPS_H_
This namespace collects libraries and tools authored by Matthias Kretz.
Definition constexpr_wrapper.h:21