6#ifndef VIR_SIMD_FLOAT_OPS_H_
7#define VIR_SIMD_FLOAT_OPS_H_
14 namespace simd_float_ops
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
21 if constexpr (
sizeof(T) <=
sizeof(
long long))
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));
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]));
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
39 if constexpr (
sizeof(T) <=
sizeof(
long long))
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));
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]));
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
57 if constexpr (
sizeof(T) <=
sizeof(
long long))
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));
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]));
This namespace collects libraries and tools authored by Matthias Kretz.
Definition constexpr_wrapper.h:21