xref: /freebsd/lib/msun/src/math_private.h (revision b83ccea32c0ddd391b77a2f28eb9c6b39aa412ba)
13a8617a8SJordan K. Hubbard /*
23a8617a8SJordan K. Hubbard  * ====================================================
33a8617a8SJordan K. Hubbard  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
43a8617a8SJordan K. Hubbard  *
53a8617a8SJordan K. Hubbard  * Developed at SunPro, a Sun Microsystems, Inc. business.
63a8617a8SJordan K. Hubbard  * Permission to use, copy, modify, and distribute this
73a8617a8SJordan K. Hubbard  * software is freely granted, provided that this notice
83a8617a8SJordan K. Hubbard  * is preserved.
93a8617a8SJordan K. Hubbard  * ====================================================
103a8617a8SJordan K. Hubbard  */
113a8617a8SJordan K. Hubbard 
123a8617a8SJordan K. Hubbard /*
133a8617a8SJordan K. Hubbard  * from: @(#)fdlibm.h 5.1 93/09/24
147f3dea24SPeter Wemm  * $FreeBSD$
153a8617a8SJordan K. Hubbard  */
163a8617a8SJordan K. Hubbard 
173a8617a8SJordan K. Hubbard #ifndef _MATH_PRIVATE_H_
183a8617a8SJordan K. Hubbard #define	_MATH_PRIVATE_H_
193a8617a8SJordan K. Hubbard 
203a8617a8SJordan K. Hubbard #include <sys/types.h>
21bcfa1759SBrian Somers #include <machine/endian.h>
223a8617a8SJordan K. Hubbard 
23ef1ee63eSAlexey Zelkin /*
24ef1ee63eSAlexey Zelkin  * The original fdlibm code used statements like:
25ef1ee63eSAlexey Zelkin  *	n0 = ((*(int*)&one)>>29)^1;		* index of high word *
26ef1ee63eSAlexey Zelkin  *	ix0 = *(n0+(int*)&x);			* high word of x *
27ef1ee63eSAlexey Zelkin  *	ix1 = *((1-n0)+(int*)&x);		* low word of x *
28ef1ee63eSAlexey Zelkin  * to dig two 32 bit words out of the 64 bit IEEE floating point
29ef1ee63eSAlexey Zelkin  * value.  That is non-ANSI, and, moreover, the gcc instruction
30ef1ee63eSAlexey Zelkin  * scheduler gets it wrong.  We instead use the following macros.
31ef1ee63eSAlexey Zelkin  * Unlike the original code, we determine the endianness at compile
32ef1ee63eSAlexey Zelkin  * time, not at run time; I don't see much benefit to selecting
33ef1ee63eSAlexey Zelkin  * endianness at run time.
34ef1ee63eSAlexey Zelkin  */
353a8617a8SJordan K. Hubbard 
36ef1ee63eSAlexey Zelkin /*
37ef1ee63eSAlexey Zelkin  * A union which permits us to convert between a double and two 32 bit
38ef1ee63eSAlexey Zelkin  * ints.
39ef1ee63eSAlexey Zelkin  */
403a8617a8SJordan K. Hubbard 
4174aed985SMarcel Moolenaar #ifdef __arm__
4274aed985SMarcel Moolenaar #if defined(__VFP_FP__)
4374aed985SMarcel Moolenaar #define	IEEE_WORD_ORDER	BYTE_ORDER
4474aed985SMarcel Moolenaar #else
4574aed985SMarcel Moolenaar #define	IEEE_WORD_ORDER	BIG_ENDIAN
4674aed985SMarcel Moolenaar #endif
4774aed985SMarcel Moolenaar #else /* __arm__ */
4874aed985SMarcel Moolenaar #define	IEEE_WORD_ORDER	BYTE_ORDER
4974aed985SMarcel Moolenaar #endif
5074aed985SMarcel Moolenaar 
5174aed985SMarcel Moolenaar #if IEEE_WORD_ORDER == BIG_ENDIAN
523a8617a8SJordan K. Hubbard 
533a8617a8SJordan K. Hubbard typedef union
543a8617a8SJordan K. Hubbard {
553a8617a8SJordan K. Hubbard   double value;
563a8617a8SJordan K. Hubbard   struct
573a8617a8SJordan K. Hubbard   {
583a8617a8SJordan K. Hubbard     u_int32_t msw;
593a8617a8SJordan K. Hubbard     u_int32_t lsw;
603a8617a8SJordan K. Hubbard   } parts;
613d4dfde4SDavid Schultz   struct
623d4dfde4SDavid Schultz   {
633d4dfde4SDavid Schultz     u_int64_t w;
643d4dfde4SDavid Schultz   } xparts;
653a8617a8SJordan K. Hubbard } ieee_double_shape_type;
663a8617a8SJordan K. Hubbard 
673a8617a8SJordan K. Hubbard #endif
683a8617a8SJordan K. Hubbard 
6974aed985SMarcel Moolenaar #if IEEE_WORD_ORDER == LITTLE_ENDIAN
703a8617a8SJordan K. Hubbard 
713a8617a8SJordan K. Hubbard typedef union
723a8617a8SJordan K. Hubbard {
733a8617a8SJordan K. Hubbard   double value;
743a8617a8SJordan K. Hubbard   struct
753a8617a8SJordan K. Hubbard   {
763a8617a8SJordan K. Hubbard     u_int32_t lsw;
773a8617a8SJordan K. Hubbard     u_int32_t msw;
783a8617a8SJordan K. Hubbard   } parts;
793d4dfde4SDavid Schultz   struct
803d4dfde4SDavid Schultz   {
813d4dfde4SDavid Schultz     u_int64_t w;
823d4dfde4SDavid Schultz   } xparts;
833a8617a8SJordan K. Hubbard } ieee_double_shape_type;
843a8617a8SJordan K. Hubbard 
853a8617a8SJordan K. Hubbard #endif
863a8617a8SJordan K. Hubbard 
873a8617a8SJordan K. Hubbard /* Get two 32 bit ints from a double.  */
883a8617a8SJordan K. Hubbard 
893a8617a8SJordan K. Hubbard #define EXTRACT_WORDS(ix0,ix1,d)				\
903a8617a8SJordan K. Hubbard do {								\
913a8617a8SJordan K. Hubbard   ieee_double_shape_type ew_u;					\
923a8617a8SJordan K. Hubbard   ew_u.value = (d);						\
933a8617a8SJordan K. Hubbard   (ix0) = ew_u.parts.msw;					\
943a8617a8SJordan K. Hubbard   (ix1) = ew_u.parts.lsw;					\
953a8617a8SJordan K. Hubbard } while (0)
963a8617a8SJordan K. Hubbard 
973d4dfde4SDavid Schultz /* Get a 64-bit int from a double. */
983d4dfde4SDavid Schultz #define EXTRACT_WORD64(ix,d)					\
993d4dfde4SDavid Schultz do {								\
1003d4dfde4SDavid Schultz   ieee_double_shape_type ew_u;					\
1013d4dfde4SDavid Schultz   ew_u.value = (d);						\
1023d4dfde4SDavid Schultz   (ix) = ew_u.xparts.w;						\
1033d4dfde4SDavid Schultz } while (0)
1043d4dfde4SDavid Schultz 
1053a8617a8SJordan K. Hubbard /* Get the more significant 32 bit int from a double.  */
1063a8617a8SJordan K. Hubbard 
1073a8617a8SJordan K. Hubbard #define GET_HIGH_WORD(i,d)					\
1083a8617a8SJordan K. Hubbard do {								\
1093a8617a8SJordan K. Hubbard   ieee_double_shape_type gh_u;					\
1103a8617a8SJordan K. Hubbard   gh_u.value = (d);						\
1113a8617a8SJordan K. Hubbard   (i) = gh_u.parts.msw;						\
1123a8617a8SJordan K. Hubbard } while (0)
1133a8617a8SJordan K. Hubbard 
1143a8617a8SJordan K. Hubbard /* Get the less significant 32 bit int from a double.  */
1153a8617a8SJordan K. Hubbard 
1163a8617a8SJordan K. Hubbard #define GET_LOW_WORD(i,d)					\
1173a8617a8SJordan K. Hubbard do {								\
1183a8617a8SJordan K. Hubbard   ieee_double_shape_type gl_u;					\
1193a8617a8SJordan K. Hubbard   gl_u.value = (d);						\
1203a8617a8SJordan K. Hubbard   (i) = gl_u.parts.lsw;						\
1213a8617a8SJordan K. Hubbard } while (0)
1223a8617a8SJordan K. Hubbard 
1233a8617a8SJordan K. Hubbard /* Set a double from two 32 bit ints.  */
1243a8617a8SJordan K. Hubbard 
1253a8617a8SJordan K. Hubbard #define INSERT_WORDS(d,ix0,ix1)					\
1263a8617a8SJordan K. Hubbard do {								\
1273a8617a8SJordan K. Hubbard   ieee_double_shape_type iw_u;					\
1283a8617a8SJordan K. Hubbard   iw_u.parts.msw = (ix0);					\
1293a8617a8SJordan K. Hubbard   iw_u.parts.lsw = (ix1);					\
1303a8617a8SJordan K. Hubbard   (d) = iw_u.value;						\
1313a8617a8SJordan K. Hubbard } while (0)
1323a8617a8SJordan K. Hubbard 
1333d4dfde4SDavid Schultz /* Set a double from a 64-bit int. */
1343d4dfde4SDavid Schultz #define INSERT_WORD64(d,ix)					\
1353d4dfde4SDavid Schultz do {								\
1363d4dfde4SDavid Schultz   ieee_double_shape_type iw_u;					\
1373d4dfde4SDavid Schultz   iw_u.xparts.w = (ix);						\
1383d4dfde4SDavid Schultz   (d) = iw_u.value;						\
1393d4dfde4SDavid Schultz } while (0)
1403d4dfde4SDavid Schultz 
1413a8617a8SJordan K. Hubbard /* Set the more significant 32 bits of a double from an int.  */
1423a8617a8SJordan K. Hubbard 
1433a8617a8SJordan K. Hubbard #define SET_HIGH_WORD(d,v)					\
1443a8617a8SJordan K. Hubbard do {								\
1453a8617a8SJordan K. Hubbard   ieee_double_shape_type sh_u;					\
1463a8617a8SJordan K. Hubbard   sh_u.value = (d);						\
1473a8617a8SJordan K. Hubbard   sh_u.parts.msw = (v);						\
1483a8617a8SJordan K. Hubbard   (d) = sh_u.value;						\
1493a8617a8SJordan K. Hubbard } while (0)
1503a8617a8SJordan K. Hubbard 
1513a8617a8SJordan K. Hubbard /* Set the less significant 32 bits of a double from an int.  */
1523a8617a8SJordan K. Hubbard 
1533a8617a8SJordan K. Hubbard #define SET_LOW_WORD(d,v)					\
1543a8617a8SJordan K. Hubbard do {								\
1553a8617a8SJordan K. Hubbard   ieee_double_shape_type sl_u;					\
1563a8617a8SJordan K. Hubbard   sl_u.value = (d);						\
1573a8617a8SJordan K. Hubbard   sl_u.parts.lsw = (v);						\
1583a8617a8SJordan K. Hubbard   (d) = sl_u.value;						\
1593a8617a8SJordan K. Hubbard } while (0)
1603a8617a8SJordan K. Hubbard 
161ef1ee63eSAlexey Zelkin /*
162ef1ee63eSAlexey Zelkin  * A union which permits us to convert between a float and a 32 bit
163ef1ee63eSAlexey Zelkin  * int.
164ef1ee63eSAlexey Zelkin  */
1653a8617a8SJordan K. Hubbard 
1663a8617a8SJordan K. Hubbard typedef union
1673a8617a8SJordan K. Hubbard {
1683a8617a8SJordan K. Hubbard   float value;
1693a8617a8SJordan K. Hubbard   /* FIXME: Assumes 32 bit int.  */
1703a8617a8SJordan K. Hubbard   unsigned int word;
1713a8617a8SJordan K. Hubbard } ieee_float_shape_type;
1723a8617a8SJordan K. Hubbard 
1733a8617a8SJordan K. Hubbard /* Get a 32 bit int from a float.  */
1743a8617a8SJordan K. Hubbard 
1753a8617a8SJordan K. Hubbard #define GET_FLOAT_WORD(i,d)					\
1763a8617a8SJordan K. Hubbard do {								\
1773a8617a8SJordan K. Hubbard   ieee_float_shape_type gf_u;					\
1783a8617a8SJordan K. Hubbard   gf_u.value = (d);						\
1793a8617a8SJordan K. Hubbard   (i) = gf_u.word;						\
1803a8617a8SJordan K. Hubbard } while (0)
1813a8617a8SJordan K. Hubbard 
1823a8617a8SJordan K. Hubbard /* Set a float from a 32 bit int.  */
1833a8617a8SJordan K. Hubbard 
1843a8617a8SJordan K. Hubbard #define SET_FLOAT_WORD(d,i)					\
1853a8617a8SJordan K. Hubbard do {								\
1863a8617a8SJordan K. Hubbard   ieee_float_shape_type sf_u;					\
1873a8617a8SJordan K. Hubbard   sf_u.word = (i);						\
1883a8617a8SJordan K. Hubbard   (d) = sf_u.value;						\
1893a8617a8SJordan K. Hubbard } while (0)
1903a8617a8SJordan K. Hubbard 
191e6239486SDavid Schultz /* Get expsign as a 16 bit int from a long double.  */
192e6239486SDavid Schultz 
193e6239486SDavid Schultz #define	GET_LDBL_EXPSIGN(i,d)					\
194e6239486SDavid Schultz do {								\
195e6239486SDavid Schultz   union IEEEl2bits ge_u;					\
196e6239486SDavid Schultz   ge_u.e = (d);							\
197e6239486SDavid Schultz   (i) = ge_u.xbits.expsign;					\
198e6239486SDavid Schultz } while (0)
199e6239486SDavid Schultz 
200e6239486SDavid Schultz /* Set expsign of a long double from a 16 bit int.  */
201e6239486SDavid Schultz 
202e6239486SDavid Schultz #define	SET_LDBL_EXPSIGN(d,v)					\
203e6239486SDavid Schultz do {								\
204e6239486SDavid Schultz   union IEEEl2bits se_u;					\
205e6239486SDavid Schultz   se_u.e = (d);							\
206e6239486SDavid Schultz   se_u.xbits.expsign = (v);					\
207e6239486SDavid Schultz   (d) = se_u.e;							\
208e6239486SDavid Schultz } while (0)
209e6239486SDavid Schultz 
210*b83ccea3SSteve Kargl /* Long double constants are broken on i386.  This workaround is OK always. */
211*b83ccea3SSteve Kargl #define	LD80C(m, ex, s, v) {					\
212*b83ccea3SSteve Kargl 	/* .e = v, */		/* overwritten */		\
213*b83ccea3SSteve Kargl 	.xbits.man = __CONCAT(m, ULL),				\
214*b83ccea3SSteve Kargl 	.xbits.expsign = (0x3fff + (ex)) | ((s) ? 0x8000 : 0),	\
215*b83ccea3SSteve Kargl }
216*b83ccea3SSteve Kargl 
2171880ccbdSBruce Evans #ifdef FLT_EVAL_METHOD
2181880ccbdSBruce Evans /*
2191880ccbdSBruce Evans  * Attempt to get strict C99 semantics for assignment with non-C99 compilers.
2201880ccbdSBruce Evans  */
2211880ccbdSBruce Evans #if FLT_EVAL_METHOD == 0 || __GNUC__ == 0
2221880ccbdSBruce Evans #define	STRICT_ASSIGN(type, lval, rval)	((lval) = (rval))
2231880ccbdSBruce Evans #else
2241880ccbdSBruce Evans #define	STRICT_ASSIGN(type, lval, rval) do {	\
2251880ccbdSBruce Evans 	volatile type __lval;			\
2261880ccbdSBruce Evans 						\
2275b62c380SBruce Evans 	if (sizeof(type) >= sizeof(double))	\
2285b62c380SBruce Evans 		(lval) = (rval);		\
2295b62c380SBruce Evans 	else {					\
2301880ccbdSBruce Evans 		__lval = (rval);		\
2311880ccbdSBruce Evans 		(lval) = __lval;		\
2325b62c380SBruce Evans 	}					\
2331880ccbdSBruce Evans } while (0)
2341880ccbdSBruce Evans #endif
235*b83ccea3SSteve Kargl #endif /* FLT_EVAL_METHOD */
236*b83ccea3SSteve Kargl 
237*b83ccea3SSteve Kargl /* Support switching the mode to FP_PE if necessary. */
238*b83ccea3SSteve Kargl #if defined(__i386__) && !defined(NO_FPSETPREC)
239*b83ccea3SSteve Kargl #define	ENTERI()				\
240*b83ccea3SSteve Kargl 	long double __retval;			\
241*b83ccea3SSteve Kargl 	fp_prec_t __oprec;			\
242*b83ccea3SSteve Kargl 						\
243*b83ccea3SSteve Kargl 	if ((__oprec = fpgetprec()) != FP_PE)	\
244*b83ccea3SSteve Kargl 		fpsetprec(FP_PE);
245*b83ccea3SSteve Kargl #define	RETURNI(x) do {				\
246*b83ccea3SSteve Kargl 	__retval = (x);				\
247*b83ccea3SSteve Kargl 	if (__oprec != FP_PE)			\
248*b83ccea3SSteve Kargl 		fpsetprec(__oprec);		\
249*b83ccea3SSteve Kargl 	RETURNF(__retval);			\
250*b83ccea3SSteve Kargl } while (0)
251*b83ccea3SSteve Kargl #else
252*b83ccea3SSteve Kargl #define	ENTERI(x)
253*b83ccea3SSteve Kargl #define	RETURNI(x)	RETURNF(x)
2541880ccbdSBruce Evans #endif
2551880ccbdSBruce Evans 
256*b83ccea3SSteve Kargl /* Default return statement if hack*_t() is not used. */
257*b83ccea3SSteve Kargl #define      RETURNF(v)      return (v)
258*b83ccea3SSteve Kargl 
2597cd4a832SDavid Schultz /*
2607cd4a832SDavid Schultz  * Common routine to process the arguments to nan(), nanf(), and nanl().
2617cd4a832SDavid Schultz  */
2627cd4a832SDavid Schultz void _scan_nan(uint32_t *__words, int __num_words, const char *__s);
2637cd4a832SDavid Schultz 
26419b114daSBruce Evans #ifdef _COMPLEX_H
26524863729SDavid Schultz 
26624863729SDavid Schultz /*
26724863729SDavid Schultz  * C99 specifies that complex numbers have the same representation as
26824863729SDavid Schultz  * an array of two elements, where the first element is the real part
26924863729SDavid Schultz  * and the second element is the imaginary part.
27024863729SDavid Schultz  */
27124863729SDavid Schultz typedef union {
27224863729SDavid Schultz 	float complex f;
27324863729SDavid Schultz 	float a[2];
27424863729SDavid Schultz } float_complex;
27524863729SDavid Schultz typedef union {
27624863729SDavid Schultz 	double complex f;
27724863729SDavid Schultz 	double a[2];
27824863729SDavid Schultz } double_complex;
27924863729SDavid Schultz typedef union {
28024863729SDavid Schultz 	long double complex f;
28124863729SDavid Schultz 	long double a[2];
28224863729SDavid Schultz } long_double_complex;
28324863729SDavid Schultz #define	REALPART(z)	((z).a[0])
28424863729SDavid Schultz #define	IMAGPART(z)	((z).a[1])
28524863729SDavid Schultz 
28619b114daSBruce Evans /*
28719b114daSBruce Evans  * Inline functions that can be used to construct complex values.
28819b114daSBruce Evans  *
28919b114daSBruce Evans  * The C99 standard intends x+I*y to be used for this, but x+I*y is
29019b114daSBruce Evans  * currently unusable in general since gcc introduces many overflow,
29119b114daSBruce Evans  * underflow, sign and efficiency bugs by rewriting I*y as
29219b114daSBruce Evans  * (0.0+I)*(y+0.0*I) and laboriously computing the full complex product.
29319b114daSBruce Evans  * In particular, I*Inf is corrupted to NaN+I*Inf, and I*-0 is corrupted
29419b114daSBruce Evans  * to -0.0+I*0.0.
29519b114daSBruce Evans  */
29619b114daSBruce Evans static __inline float complex
29719b114daSBruce Evans cpackf(float x, float y)
29819b114daSBruce Evans {
29924863729SDavid Schultz 	float_complex z;
30019b114daSBruce Evans 
30124863729SDavid Schultz 	REALPART(z) = x;
30224863729SDavid Schultz 	IMAGPART(z) = y;
30324863729SDavid Schultz 	return (z.f);
30419b114daSBruce Evans }
30519b114daSBruce Evans 
30619b114daSBruce Evans static __inline double complex
30719b114daSBruce Evans cpack(double x, double y)
30819b114daSBruce Evans {
30924863729SDavid Schultz 	double_complex z;
31019b114daSBruce Evans 
31124863729SDavid Schultz 	REALPART(z) = x;
31224863729SDavid Schultz 	IMAGPART(z) = y;
31324863729SDavid Schultz 	return (z.f);
31419b114daSBruce Evans }
31519b114daSBruce Evans 
31619b114daSBruce Evans static __inline long double complex
31719b114daSBruce Evans cpackl(long double x, long double y)
31819b114daSBruce Evans {
31924863729SDavid Schultz 	long_double_complex z;
32019b114daSBruce Evans 
32124863729SDavid Schultz 	REALPART(z) = x;
32224863729SDavid Schultz 	IMAGPART(z) = y;
32324863729SDavid Schultz 	return (z.f);
32419b114daSBruce Evans }
32519b114daSBruce Evans #endif /* _COMPLEX_H */
32619b114daSBruce Evans 
3270ddfa46bSBruce Evans #ifdef __GNUCLIKE_ASM
3280ddfa46bSBruce Evans 
3290ddfa46bSBruce Evans /* Asm versions of some functions. */
3300ddfa46bSBruce Evans 
3310ddfa46bSBruce Evans #ifdef __amd64__
3320ddfa46bSBruce Evans static __inline int
3330ddfa46bSBruce Evans irint(double x)
3340ddfa46bSBruce Evans {
3350ddfa46bSBruce Evans 	int n;
3360ddfa46bSBruce Evans 
337a4f326ddSEd Schouten 	asm("cvtsd2si %1,%0" : "=r" (n) : "x" (x));
3380ddfa46bSBruce Evans 	return (n);
3390ddfa46bSBruce Evans }
3400ddfa46bSBruce Evans #define	HAVE_EFFICIENT_IRINT
3410ddfa46bSBruce Evans #endif
3420ddfa46bSBruce Evans 
3430ddfa46bSBruce Evans #ifdef __i386__
3440ddfa46bSBruce Evans static __inline int
3450ddfa46bSBruce Evans irint(double x)
3460ddfa46bSBruce Evans {
3470ddfa46bSBruce Evans 	int n;
3480ddfa46bSBruce Evans 
3490ddfa46bSBruce Evans 	asm("fistl %0" : "=m" (n) : "t" (x));
3500ddfa46bSBruce Evans 	return (n);
3510ddfa46bSBruce Evans }
3520ddfa46bSBruce Evans #define	HAVE_EFFICIENT_IRINT
3530ddfa46bSBruce Evans #endif
3540ddfa46bSBruce Evans 
355*b83ccea3SSteve Kargl #if defined(__amd64__) || defined(__i386__)
356*b83ccea3SSteve Kargl static __inline int
357*b83ccea3SSteve Kargl irintl(long double x)
358*b83ccea3SSteve Kargl {
359*b83ccea3SSteve Kargl 	int n;
360*b83ccea3SSteve Kargl 
361*b83ccea3SSteve Kargl 	asm("fistl %0" : "=m" (n) : "t" (x));
362*b83ccea3SSteve Kargl 	return (n);
363*b83ccea3SSteve Kargl }
364*b83ccea3SSteve Kargl #define	HAVE_EFFICIENT_IRINTL
365*b83ccea3SSteve Kargl #endif
366*b83ccea3SSteve Kargl 
3670ddfa46bSBruce Evans #endif /* __GNUCLIKE_ASM */
3680ddfa46bSBruce Evans 
369e1b61b5bSDavid Schultz /*
370e1b61b5bSDavid Schultz  * ieee style elementary functions
371e1b61b5bSDavid Schultz  *
372e1b61b5bSDavid Schultz  * We rename functions here to improve other sources' diffability
373e1b61b5bSDavid Schultz  * against fdlibm.
374e1b61b5bSDavid Schultz  */
375e1b61b5bSDavid Schultz #define	__ieee754_sqrt	sqrt
376e1b61b5bSDavid Schultz #define	__ieee754_acos	acos
377e1b61b5bSDavid Schultz #define	__ieee754_acosh	acosh
378e1b61b5bSDavid Schultz #define	__ieee754_log	log
379177668d1SDavid Schultz #define	__ieee754_log2	log2
380e1b61b5bSDavid Schultz #define	__ieee754_atanh	atanh
381e1b61b5bSDavid Schultz #define	__ieee754_asin	asin
382e1b61b5bSDavid Schultz #define	__ieee754_atan2	atan2
383e1b61b5bSDavid Schultz #define	__ieee754_exp	exp
384e1b61b5bSDavid Schultz #define	__ieee754_cosh	cosh
385e1b61b5bSDavid Schultz #define	__ieee754_fmod	fmod
386e1b61b5bSDavid Schultz #define	__ieee754_pow	pow
387e1b61b5bSDavid Schultz #define	__ieee754_lgamma lgamma
388e1b61b5bSDavid Schultz #define	__ieee754_gamma	gamma
389e1b61b5bSDavid Schultz #define	__ieee754_lgamma_r lgamma_r
390e1b61b5bSDavid Schultz #define	__ieee754_gamma_r gamma_r
391e1b61b5bSDavid Schultz #define	__ieee754_log10	log10
392e1b61b5bSDavid Schultz #define	__ieee754_sinh	sinh
393e1b61b5bSDavid Schultz #define	__ieee754_hypot	hypot
394e1b61b5bSDavid Schultz #define	__ieee754_j0	j0
395e1b61b5bSDavid Schultz #define	__ieee754_j1	j1
396e1b61b5bSDavid Schultz #define	__ieee754_y0	y0
397e1b61b5bSDavid Schultz #define	__ieee754_y1	y1
398e1b61b5bSDavid Schultz #define	__ieee754_jn	jn
399e1b61b5bSDavid Schultz #define	__ieee754_yn	yn
400e1b61b5bSDavid Schultz #define	__ieee754_remainder remainder
401e1b61b5bSDavid Schultz #define	__ieee754_scalb	scalb
402e1b61b5bSDavid Schultz #define	__ieee754_sqrtf	sqrtf
403e1b61b5bSDavid Schultz #define	__ieee754_acosf	acosf
404e1b61b5bSDavid Schultz #define	__ieee754_acoshf acoshf
405e1b61b5bSDavid Schultz #define	__ieee754_logf	logf
406e1b61b5bSDavid Schultz #define	__ieee754_atanhf atanhf
407e1b61b5bSDavid Schultz #define	__ieee754_asinf	asinf
408e1b61b5bSDavid Schultz #define	__ieee754_atan2f atan2f
409e1b61b5bSDavid Schultz #define	__ieee754_expf	expf
410e1b61b5bSDavid Schultz #define	__ieee754_coshf	coshf
411e1b61b5bSDavid Schultz #define	__ieee754_fmodf	fmodf
412e1b61b5bSDavid Schultz #define	__ieee754_powf	powf
413e1b61b5bSDavid Schultz #define	__ieee754_lgammaf lgammaf
414e1b61b5bSDavid Schultz #define	__ieee754_gammaf gammaf
415e1b61b5bSDavid Schultz #define	__ieee754_lgammaf_r lgammaf_r
416e1b61b5bSDavid Schultz #define	__ieee754_gammaf_r gammaf_r
417e1b61b5bSDavid Schultz #define	__ieee754_log10f log10f
418177668d1SDavid Schultz #define	__ieee754_log2f log2f
419e1b61b5bSDavid Schultz #define	__ieee754_sinhf	sinhf
420e1b61b5bSDavid Schultz #define	__ieee754_hypotf hypotf
421e1b61b5bSDavid Schultz #define	__ieee754_j0f	j0f
422e1b61b5bSDavid Schultz #define	__ieee754_j1f	j1f
423e1b61b5bSDavid Schultz #define	__ieee754_y0f	y0f
424e1b61b5bSDavid Schultz #define	__ieee754_y1f	y1f
425e1b61b5bSDavid Schultz #define	__ieee754_jnf	jnf
426e1b61b5bSDavid Schultz #define	__ieee754_ynf	ynf
427e1b61b5bSDavid Schultz #define	__ieee754_remainderf remainderf
428e1b61b5bSDavid Schultz #define	__ieee754_scalbf scalbf
4293a8617a8SJordan K. Hubbard 
4303a8617a8SJordan K. Hubbard /* fdlibm kernel function */
431079299f7SDavid Schultz int	__kernel_rem_pio2(double*,double*,int,int,int);
432079299f7SDavid Schultz 
433079299f7SDavid Schultz /* double precision kernel functions */
434b492f289SEd Schouten #ifdef INLINE_REM_PIO2
435b492f289SEd Schouten __inline
436b492f289SEd Schouten #endif
437e02846ceSDavid Schultz int	__ieee754_rem_pio2(double,double*);
43869160b1eSDavid E. O'Brien double	__kernel_sin(double,double,int);
43969160b1eSDavid E. O'Brien double	__kernel_cos(double,double);
44069160b1eSDavid E. O'Brien double	__kernel_tan(double,double,int);
44112188b77SDavid Schultz double	__ldexp_exp(double,int);
44212188b77SDavid Schultz #ifdef _COMPLEX_H
44312188b77SDavid Schultz double complex __ldexp_cexp(double complex,int);
44412188b77SDavid Schultz #endif
4453a8617a8SJordan K. Hubbard 
446079299f7SDavid Schultz /* float precision kernel functions */
447b492f289SEd Schouten #ifdef INLINE_REM_PIO2F
448b492f289SEd Schouten __inline
449b492f289SEd Schouten #endif
45070d818a2SBruce Evans int	__ieee754_rem_pio2f(float,double*);
451b492f289SEd Schouten #ifdef INLINE_KERNEL_SINDF
452b492f289SEd Schouten __inline
453b492f289SEd Schouten #endif
45459aad933SBruce Evans float	__kernel_sindf(double);
455b492f289SEd Schouten #ifdef INLINE_KERNEL_COSDF
456b492f289SEd Schouten __inline
457b492f289SEd Schouten #endif
45859aad933SBruce Evans float	__kernel_cosdf(double);
459b492f289SEd Schouten #ifdef INLINE_KERNEL_TANDF
460b492f289SEd Schouten __inline
461b492f289SEd Schouten #endif
46294a5f9beSBruce Evans float	__kernel_tandf(double,int);
46312188b77SDavid Schultz float	__ldexp_expf(float,int);
46412188b77SDavid Schultz #ifdef _COMPLEX_H
46512188b77SDavid Schultz float complex __ldexp_cexpf(float complex,int);
46612188b77SDavid Schultz #endif
467079299f7SDavid Schultz 
468079299f7SDavid Schultz /* long double precision kernel functions */
469079299f7SDavid Schultz long double __kernel_sinl(long double, long double, int);
470079299f7SDavid Schultz long double __kernel_cosl(long double, long double);
471079299f7SDavid Schultz long double __kernel_tanl(long double, long double, int);
4723a8617a8SJordan K. Hubbard 
473ef1ee63eSAlexey Zelkin #endif /* !_MATH_PRIVATE_H_ */
474