4 #include "_vectorize.hpp"
9 template<length_t L,
typename T, qualifier Q,
bool UseSimd>
10 struct compute_vec_add {};
12 template<length_t L,
typename T, qualifier Q,
bool UseSimd>
13 struct compute_vec_sub {};
15 template<length_t L,
typename T, qualifier Q,
bool UseSimd>
16 struct compute_vec_mul {};
18 template<length_t L,
typename T, qualifier Q,
bool UseSimd>
19 struct compute_vec_div {};
21 template<length_t L,
typename T, qualifier Q,
bool UseSimd>
22 struct compute_vec_mod {};
24 template<length_t L,
typename T, qualifier Q,
bool UseSimd>
25 struct compute_splat {};
27 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size,
bool UseSimd>
28 struct compute_vec_and {};
30 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size,
bool UseSimd>
31 struct compute_vec_or {};
33 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size,
bool UseSimd>
34 struct compute_vec_xor {};
36 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size,
bool UseSimd>
37 struct compute_vec_shift_left {};
39 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size,
bool UseSimd>
40 struct compute_vec_shift_right {};
42 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size,
bool UseSimd>
43 struct compute_vec_equal {};
45 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size,
bool UseSimd>
46 struct compute_vec_nequal {};
48 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size,
bool UseSimd>
49 struct compute_vec_bitwise_not {};
51 template<length_t L,
typename T, qualifier Q>
52 struct compute_vec_add<L, T, Q, false>
54 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
56 return detail::functor2<vec, L, T, Q>::call(std::plus<T>(), a, b);
60 template<length_t L,
typename T, qualifier Q>
61 struct compute_vec_sub<L, T, Q, false>
63 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
65 return detail::functor2<vec, L, T, Q>::call(std::minus<T>(), a, b);
69 template<length_t L,
typename T, qualifier Q>
70 struct compute_vec_mul<L, T, Q, false>
72 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
74 return detail::functor2<vec, L, T, Q>::call(std::multiplies<T>(), a, b);
78 template<length_t L,
typename T, qualifier Q>
79 struct compute_vec_div<L, T, Q, false>
81 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
83 return detail::functor2<vec, L, T, Q>::call(std::divides<T>(), a, b);
87 template<length_t L,
typename T, qualifier Q>
88 struct compute_vec_mod<L, T, Q, false>
90 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
92 return detail::functor2<vec, L, T, Q>::call(std::modulus<T>(), a, b);
96 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size>
97 struct compute_vec_and<L, T, Q, IsInt, Size, false>
99 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
102 for (length_t i = 0; i < L; ++i)
103 v[i] &=
static_cast<T
>(b[i]);
108 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size>
109 struct compute_vec_or<L, T, Q, IsInt, Size, false>
111 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
114 for (length_t i = 0; i < L; ++i)
115 v[i] |=
static_cast<T
>(b[i]);
120 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size>
121 struct compute_vec_xor<L, T, Q, IsInt, Size, false>
123 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
126 for (length_t i = 0; i < L; ++i)
127 v[i] ^=
static_cast<T
>(b[i]);
132 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size>
133 struct compute_vec_shift_left<L, T, Q, IsInt, Size, false>
135 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
138 for (length_t i = 0; i < L; ++i)
139 v[i] <<=
static_cast<T
>(b[i]);
144 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size>
145 struct compute_vec_shift_right<L, T, Q, IsInt, Size, false>
147 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a, vec<L, T, Q>
const& b)
150 for (length_t i = 0; i < L; ++i)
151 v[i] >>=
static_cast<T
>(b[i]);
156 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size>
157 struct compute_vec_equal<L, T, Q, IsInt, Size, false>
159 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static bool call(vec<L, T, Q>
const& v1, vec<L, T, Q>
const& v2)
162 for (length_t i = 0; b && i < L; ++i)
163 b = detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1[i], v2[i]);
168 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size>
169 struct compute_vec_nequal<L, T, Q, IsInt, Size, false>
171 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static bool call(vec<4, T, Q>
const& v1, vec<4, T, Q>
const& v2)
173 return !compute_vec_equal<L, T, Q, detail::is_int<T>::value,
sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2);
177 template<length_t L,
typename T, qualifier Q,
int IsInt, std::
size_t Size>
178 struct compute_vec_bitwise_not<L, T, Q, IsInt, Size, false>
180 GLM_FUNC_QUALIFIER GLM_CONSTEXPR
static vec<L, T, Q> call(vec<L, T, Q>
const& a)
183 for (length_t i = 0; i < L; ++i)