11#ifndef EIGEN_ARCH_GENERIC_PACKET_MATH_FUNCTIONS_FWD_H
12#define EIGEN_ARCH_GENERIC_PACKET_MATH_FUNCTIONS_FWD_H
15#include "../../InternalHeaderCheck.h"
31template <
typename Packet>
32EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pfrexp_generic(
const Packet& a, Packet& exponent);
37template <
typename Packet>
38EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pfrexp_generic_get_biased_exponent(
const Packet& p);
43template <
typename Packet>
44EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pldexp_generic(
const Packet& a,
const Packet& exponent);
47template <
typename Packet>
48EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pldexp_apply_factors(
const Packet& a,
const Packet& c1,
const Packet& c2);
59template <
typename Packet>
60EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pldexp_fast(
const Packet& a,
const Packet& exponent);
67template <
typename Packet,
typename =
void>
68struct has_exponent_bit_ops;
69template <
typename Packet>
70EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet exponent_bits_shift_right(
const Packet& bits);
71template <
typename Packet>
72EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet exponent_bits_sub(
const Packet& a_bits,
const Packet& b_bits);
76template <
typename Packet>
77EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcbrt_float(
const Packet& x_in);
80template <
typename Packet>
81EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcbrt_double(
const Packet& x_in);
84template <
typename Packet>
85EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog_float(
const Packet _x);
88template <
typename Packet>
89EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2_float(
const Packet _x);
92template <
typename Packet>
93EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog_double(
const Packet _x);
96template <
typename Packet>
97EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog2_double(
const Packet _x);
100template <
typename Packet>
101EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet generic_log1p(
const Packet& x);
104template <
typename Packet>
105EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet generic_log1p_float(
const Packet& x);
108template <
typename Packet>
109EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet generic_log1p_double(
const Packet& x);
112template <
typename Packet>
113EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog1p_float(
const Packet& x) {
114 return generic_log1p_float(x);
118template <
typename Packet>
119EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog1p_double(
const Packet& x) {
120 return generic_log1p_double(x);
124template <
typename Packet>
125EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet generic_expm1(
const Packet& x);
128template <
typename Packet>
129EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet generic_atan(
const Packet& x);
132template <
typename Packet>
133EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet generic_exp2(
const Packet& x);
136template <
typename Packet>
137EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet generic_exp2_reduced(
const Packet& f);
140template <
typename Packet,
bool IsFinite = false>
141EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp_float(
const Packet _x);
144template <
typename Packet>
145EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp_double(
const Packet _x);
148template <
typename Packet>
149EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin_float(
const Packet& x);
152template <
typename Packet>
153EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos_float(
const Packet& x);
156template <
typename Packet>
157EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptan_float(
const Packet& x);
160template <
typename Packet>
161EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psin_double(
const Packet& x);
164template <
typename Packet>
165EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcos_double(
const Packet& x);
168template <
typename Packet>
169EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptan_double(
const Packet& x);
172template <
typename Packet>
173EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasin_float(
const Packet& x);
176template <
typename Packet>
177EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pacos_float(
const Packet& x);
180template <
typename Packet>
181EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptanh_float(
const Packet& x);
184template <
typename Packet>
185EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet ptanh_double(
const Packet& x);
188template <
typename Packet>
189EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh_float(
const Packet& x);
192template <
typename Packet>
193EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet patanh_double(
const Packet& x);
196template <
typename Packet>
197EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psinh_float(
const Packet& x);
200template <
typename Packet>
201EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psinh_double(
const Packet& x);
204template <
typename Packet>
205EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcosh_float(
const Packet& x);
208template <
typename Packet>
209EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pcosh_double(
const Packet& x);
212template <
typename Packet>
213EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasinh_float(
const Packet& x);
216template <
typename Packet>
217EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pasinh_double(
const Packet& x);
220template <
typename Packet>
221EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pacosh_float(
const Packet& x);
224template <
typename Packet>
225EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pacosh_double(
const Packet& x);
228template <
typename Packet>
229EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog10_float(
const Packet& x);
232template <
typename Packet>
233EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog10_double(
const Packet& x);
236template <
typename Packet>
237EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet psqrt_complex(
const Packet& a);
240template <
typename Packet>
241EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pdiv_complex(
const Packet& x,
const Packet& y);
244template <
typename Packet>
245EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pmul_complex(
const Packet& x,
const Packet& y);
247template <
typename Packet,
int N>
251template <
typename Packet>
252EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet plog_complex(
const Packet& x);
255template <
typename Packet>
256EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS Packet pexp_complex(
const Packet& x);
258template <
typename Packet>
259EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet generic_rint(
const Packet& a);
261template <
typename Packet>
262EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet generic_floor(
const Packet& a);
264template <
typename Packet>
265EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet generic_ceil(
const Packet& a);
267template <
typename Packet>
268EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet generic_trunc(
const Packet& a);
270template <
typename Packet>
271EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet generic_round(
const Packet& a);
274#define EIGEN_PACKET_FUNCTION(METHOD, SCALAR, PACKET) \
276 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC EIGEN_UNUSED PACKET p##METHOD<PACKET>(const PACKET& _x) { \
277 return p##METHOD##_##SCALAR(_x); \
281#define EIGEN_GENERIC_PACKET_FUNCTION(METHOD, PACKET) \
283 EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC EIGEN_UNUSED PACKET p##METHOD<PACKET>(const PACKET& _x) { \
284 return generic_##METHOD(_x); \
287#define EIGEN_FLOAT_PACKET_FUNCTION(METHOD, PACKET) EIGEN_PACKET_FUNCTION(METHOD, float, PACKET)
288#define EIGEN_DOUBLE_PACKET_FUNCTION(METHOD, PACKET) EIGEN_PACKET_FUNCTION(METHOD, double, PACKET)
290#define EIGEN_INSTANTIATE_GENERIC_MATH_FUNCS_FLOAT(PACKET) \
291 EIGEN_FLOAT_PACKET_FUNCTION(sin, PACKET) \
292 EIGEN_FLOAT_PACKET_FUNCTION(cos, PACKET) \
293 EIGEN_FLOAT_PACKET_FUNCTION(tan, PACKET) \
294 EIGEN_FLOAT_PACKET_FUNCTION(asin, PACKET) \
295 EIGEN_FLOAT_PACKET_FUNCTION(acos, PACKET) \
296 EIGEN_FLOAT_PACKET_FUNCTION(sinh, PACKET) \
297 EIGEN_FLOAT_PACKET_FUNCTION(cosh, PACKET) \
298 EIGEN_FLOAT_PACKET_FUNCTION(tanh, PACKET) \
299 EIGEN_FLOAT_PACKET_FUNCTION(asinh, PACKET) \
300 EIGEN_FLOAT_PACKET_FUNCTION(acosh, PACKET) \
301 EIGEN_FLOAT_PACKET_FUNCTION(atanh, PACKET) \
302 EIGEN_FLOAT_PACKET_FUNCTION(log, PACKET) \
303 EIGEN_FLOAT_PACKET_FUNCTION(log2, PACKET) \
304 EIGEN_FLOAT_PACKET_FUNCTION(log10, PACKET) \
305 EIGEN_FLOAT_PACKET_FUNCTION(exp, PACKET) \
306 EIGEN_FLOAT_PACKET_FUNCTION(cbrt, PACKET) \
307 EIGEN_GENERIC_PACKET_FUNCTION(expm1, PACKET) \
308 EIGEN_GENERIC_PACKET_FUNCTION(exp2, PACKET) \
309 EIGEN_FLOAT_PACKET_FUNCTION(log1p, PACKET) \
310 EIGEN_GENERIC_PACKET_FUNCTION(atan, PACKET)
312#define EIGEN_INSTANTIATE_GENERIC_MATH_FUNCS_DOUBLE(PACKET) \
313 EIGEN_DOUBLE_PACKET_FUNCTION(sin, PACKET) \
314 EIGEN_DOUBLE_PACKET_FUNCTION(cos, PACKET) \
315 EIGEN_DOUBLE_PACKET_FUNCTION(tan, PACKET) \
316 EIGEN_DOUBLE_PACKET_FUNCTION(sinh, PACKET) \
317 EIGEN_DOUBLE_PACKET_FUNCTION(cosh, PACKET) \
318 EIGEN_DOUBLE_PACKET_FUNCTION(tanh, PACKET) \
319 EIGEN_DOUBLE_PACKET_FUNCTION(asinh, PACKET) \
320 EIGEN_DOUBLE_PACKET_FUNCTION(acosh, PACKET) \
321 EIGEN_DOUBLE_PACKET_FUNCTION(atanh, PACKET) \
322 EIGEN_DOUBLE_PACKET_FUNCTION(log, PACKET) \
323 EIGEN_DOUBLE_PACKET_FUNCTION(log2, PACKET) \
324 EIGEN_DOUBLE_PACKET_FUNCTION(log10, PACKET) \
325 EIGEN_DOUBLE_PACKET_FUNCTION(exp, PACKET) \
326 EIGEN_DOUBLE_PACKET_FUNCTION(cbrt, PACKET) \
327 EIGEN_GENERIC_PACKET_FUNCTION(expm1, PACKET) \
328 EIGEN_GENERIC_PACKET_FUNCTION(exp2, PACKET) \
329 EIGEN_DOUBLE_PACKET_FUNCTION(log1p, PACKET) \
330 EIGEN_GENERIC_PACKET_FUNCTION(atan, PACKET)
334#define EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS(PacketType) \
336 EIGEN_STRONG_INLINE PacketType psqrt<PacketType>(const PacketType& a) { \
337 return psqrt_complex<PacketType>(a); \
340 EIGEN_STRONG_INLINE PacketType plog<PacketType>(const PacketType& a) { \
341 return plog_complex<PacketType>(a); \
344 EIGEN_STRONG_INLINE PacketType pexp<PacketType>(const PacketType& a) { \
345 return pexp_complex<PacketType>(a); \
349#define EIGEN_INSTANTIATE_COMPLEX_MATH_FUNCS_NO_EXP(PacketType) \
351 EIGEN_STRONG_INLINE PacketType psqrt<PacketType>(const PacketType& a) { \
352 return psqrt_complex<PacketType>(a); \
355 EIGEN_STRONG_INLINE PacketType plog<PacketType>(const PacketType& a) { \
356 return plog_complex<PacketType>(a); \