xref: /freebsd/lib/msun/src/math_private.h (revision a077586c537d92568f226ec30479ea865298d8e1)
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*a077586cSSteve Kargl #ifdef __i386__
211*a077586cSSteve Kargl /* Long double constants are broken on i386. */
212*a077586cSSteve Kargl #define	LD80C(m, ex, v) {						\
213b83ccea3SSteve Kargl 	.xbits.man = __CONCAT(m, ULL),					\
214*a077586cSSteve Kargl 	.xbits.expsign = (0x3fff + (ex)) | ((v) < 0 ? 0x8000 : 0),	\
215b83ccea3SSteve Kargl }
216*a077586cSSteve Kargl #else
217*a077586cSSteve Kargl /* The above works on non-i386 too, but we use this to check v. */
218*a077586cSSteve Kargl #define	LD80C(m, ex, v)	{ .e = (v), }
219*a077586cSSteve Kargl #endif
220b83ccea3SSteve Kargl 
2211880ccbdSBruce Evans #ifdef FLT_EVAL_METHOD
2221880ccbdSBruce Evans /*
2231880ccbdSBruce Evans  * Attempt to get strict C99 semantics for assignment with non-C99 compilers.
2241880ccbdSBruce Evans  */
2251880ccbdSBruce Evans #if FLT_EVAL_METHOD == 0 || __GNUC__ == 0
2261880ccbdSBruce Evans #define	STRICT_ASSIGN(type, lval, rval)	((lval) = (rval))
2271880ccbdSBruce Evans #else
2281880ccbdSBruce Evans #define	STRICT_ASSIGN(type, lval, rval) do {	\
2291880ccbdSBruce Evans 	volatile type __lval;			\
2301880ccbdSBruce Evans 						\
231e6f9129aSSteve Kargl 	if (sizeof(type) >= sizeof(long double))	\
2325b62c380SBruce Evans 		(lval) = (rval);		\
2335b62c380SBruce Evans 	else {					\
2341880ccbdSBruce Evans 		__lval = (rval);		\
2351880ccbdSBruce Evans 		(lval) = __lval;		\
2365b62c380SBruce Evans 	}					\
2371880ccbdSBruce Evans } while (0)
2381880ccbdSBruce Evans #endif
239b83ccea3SSteve Kargl #endif /* FLT_EVAL_METHOD */
240b83ccea3SSteve Kargl 
241b83ccea3SSteve Kargl /* Support switching the mode to FP_PE if necessary. */
242b83ccea3SSteve Kargl #if defined(__i386__) && !defined(NO_FPSETPREC)
243b83ccea3SSteve Kargl #define	ENTERI()				\
244b83ccea3SSteve Kargl 	long double __retval;			\
245b83ccea3SSteve Kargl 	fp_prec_t __oprec;			\
246b83ccea3SSteve Kargl 						\
247b83ccea3SSteve Kargl 	if ((__oprec = fpgetprec()) != FP_PE)	\
248e6f9129aSSteve Kargl 		fpsetprec(FP_PE)
249b83ccea3SSteve Kargl #define	RETURNI(x) do {				\
250b83ccea3SSteve Kargl 	__retval = (x);				\
251b83ccea3SSteve Kargl 	if (__oprec != FP_PE)			\
252b83ccea3SSteve Kargl 		fpsetprec(__oprec);		\
253b83ccea3SSteve Kargl 	RETURNF(__retval);			\
254b83ccea3SSteve Kargl } while (0)
255b83ccea3SSteve Kargl #else
256b83ccea3SSteve Kargl #define	ENTERI(x)
257b83ccea3SSteve Kargl #define	RETURNI(x)	RETURNF(x)
2581880ccbdSBruce Evans #endif
2591880ccbdSBruce Evans 
260b83ccea3SSteve Kargl /* Default return statement if hack*_t() is not used. */
261b83ccea3SSteve Kargl #define      RETURNF(v)      return (v)
262b83ccea3SSteve Kargl 
2637cd4a832SDavid Schultz /*
2647cd4a832SDavid Schultz  * Common routine to process the arguments to nan(), nanf(), and nanl().
2657cd4a832SDavid Schultz  */
2667cd4a832SDavid Schultz void _scan_nan(uint32_t *__words, int __num_words, const char *__s);
2677cd4a832SDavid Schultz 
26819b114daSBruce Evans #ifdef _COMPLEX_H
26924863729SDavid Schultz 
27024863729SDavid Schultz /*
27124863729SDavid Schultz  * C99 specifies that complex numbers have the same representation as
27224863729SDavid Schultz  * an array of two elements, where the first element is the real part
27324863729SDavid Schultz  * and the second element is the imaginary part.
27424863729SDavid Schultz  */
27524863729SDavid Schultz typedef union {
27624863729SDavid Schultz 	float complex f;
27724863729SDavid Schultz 	float a[2];
27824863729SDavid Schultz } float_complex;
27924863729SDavid Schultz typedef union {
28024863729SDavid Schultz 	double complex f;
28124863729SDavid Schultz 	double a[2];
28224863729SDavid Schultz } double_complex;
28324863729SDavid Schultz typedef union {
28424863729SDavid Schultz 	long double complex f;
28524863729SDavid Schultz 	long double a[2];
28624863729SDavid Schultz } long_double_complex;
28724863729SDavid Schultz #define	REALPART(z)	((z).a[0])
28824863729SDavid Schultz #define	IMAGPART(z)	((z).a[1])
28924863729SDavid Schultz 
29019b114daSBruce Evans /*
29119b114daSBruce Evans  * Inline functions that can be used to construct complex values.
29219b114daSBruce Evans  *
29319b114daSBruce Evans  * The C99 standard intends x+I*y to be used for this, but x+I*y is
29419b114daSBruce Evans  * currently unusable in general since gcc introduces many overflow,
29519b114daSBruce Evans  * underflow, sign and efficiency bugs by rewriting I*y as
29619b114daSBruce Evans  * (0.0+I)*(y+0.0*I) and laboriously computing the full complex product.
29719b114daSBruce Evans  * In particular, I*Inf is corrupted to NaN+I*Inf, and I*-0 is corrupted
29819b114daSBruce Evans  * to -0.0+I*0.0.
29919b114daSBruce Evans  */
30019b114daSBruce Evans static __inline float complex
30119b114daSBruce Evans cpackf(float x, float y)
30219b114daSBruce Evans {
30324863729SDavid Schultz 	float_complex z;
30419b114daSBruce Evans 
30524863729SDavid Schultz 	REALPART(z) = x;
30624863729SDavid Schultz 	IMAGPART(z) = y;
30724863729SDavid Schultz 	return (z.f);
30819b114daSBruce Evans }
30919b114daSBruce Evans 
31019b114daSBruce Evans static __inline double complex
31119b114daSBruce Evans cpack(double x, double y)
31219b114daSBruce Evans {
31324863729SDavid Schultz 	double_complex z;
31419b114daSBruce Evans 
31524863729SDavid Schultz 	REALPART(z) = x;
31624863729SDavid Schultz 	IMAGPART(z) = y;
31724863729SDavid Schultz 	return (z.f);
31819b114daSBruce Evans }
31919b114daSBruce Evans 
32019b114daSBruce Evans static __inline long double complex
32119b114daSBruce Evans cpackl(long double x, long double y)
32219b114daSBruce Evans {
32324863729SDavid Schultz 	long_double_complex z;
32419b114daSBruce Evans 
32524863729SDavid Schultz 	REALPART(z) = x;
32624863729SDavid Schultz 	IMAGPART(z) = y;
32724863729SDavid Schultz 	return (z.f);
32819b114daSBruce Evans }
32919b114daSBruce Evans #endif /* _COMPLEX_H */
33019b114daSBruce Evans 
3310ddfa46bSBruce Evans #ifdef __GNUCLIKE_ASM
3320ddfa46bSBruce Evans 
3330ddfa46bSBruce Evans /* Asm versions of some functions. */
3340ddfa46bSBruce Evans 
3350ddfa46bSBruce Evans #ifdef __amd64__
3360ddfa46bSBruce Evans static __inline int
3370ddfa46bSBruce Evans irint(double x)
3380ddfa46bSBruce Evans {
3390ddfa46bSBruce Evans 	int n;
3400ddfa46bSBruce Evans 
341a4f326ddSEd Schouten 	asm("cvtsd2si %1,%0" : "=r" (n) : "x" (x));
3420ddfa46bSBruce Evans 	return (n);
3430ddfa46bSBruce Evans }
3440ddfa46bSBruce Evans #define	HAVE_EFFICIENT_IRINT
3450ddfa46bSBruce Evans #endif
3460ddfa46bSBruce Evans 
3470ddfa46bSBruce Evans #ifdef __i386__
3480ddfa46bSBruce Evans static __inline int
3490ddfa46bSBruce Evans irint(double x)
3500ddfa46bSBruce Evans {
3510ddfa46bSBruce Evans 	int n;
3520ddfa46bSBruce Evans 
3530ddfa46bSBruce Evans 	asm("fistl %0" : "=m" (n) : "t" (x));
3540ddfa46bSBruce Evans 	return (n);
3550ddfa46bSBruce Evans }
3560ddfa46bSBruce Evans #define	HAVE_EFFICIENT_IRINT
3570ddfa46bSBruce Evans #endif
3580ddfa46bSBruce Evans 
359b83ccea3SSteve Kargl #if defined(__amd64__) || defined(__i386__)
360b83ccea3SSteve Kargl static __inline int
361b83ccea3SSteve Kargl irintl(long double x)
362b83ccea3SSteve Kargl {
363b83ccea3SSteve Kargl 	int n;
364b83ccea3SSteve Kargl 
365b83ccea3SSteve Kargl 	asm("fistl %0" : "=m" (n) : "t" (x));
366b83ccea3SSteve Kargl 	return (n);
367b83ccea3SSteve Kargl }
368b83ccea3SSteve Kargl #define	HAVE_EFFICIENT_IRINTL
369b83ccea3SSteve Kargl #endif
370b83ccea3SSteve Kargl 
3710ddfa46bSBruce Evans #endif /* __GNUCLIKE_ASM */
3720ddfa46bSBruce Evans 
373e1b61b5bSDavid Schultz /*
374e1b61b5bSDavid Schultz  * ieee style elementary functions
375e1b61b5bSDavid Schultz  *
376e1b61b5bSDavid Schultz  * We rename functions here to improve other sources' diffability
377e1b61b5bSDavid Schultz  * against fdlibm.
378e1b61b5bSDavid Schultz  */
379e1b61b5bSDavid Schultz #define	__ieee754_sqrt	sqrt
380e1b61b5bSDavid Schultz #define	__ieee754_acos	acos
381e1b61b5bSDavid Schultz #define	__ieee754_acosh	acosh
382e1b61b5bSDavid Schultz #define	__ieee754_log	log
383177668d1SDavid Schultz #define	__ieee754_log2	log2
384e1b61b5bSDavid Schultz #define	__ieee754_atanh	atanh
385e1b61b5bSDavid Schultz #define	__ieee754_asin	asin
386e1b61b5bSDavid Schultz #define	__ieee754_atan2	atan2
387e1b61b5bSDavid Schultz #define	__ieee754_exp	exp
388e1b61b5bSDavid Schultz #define	__ieee754_cosh	cosh
389e1b61b5bSDavid Schultz #define	__ieee754_fmod	fmod
390e1b61b5bSDavid Schultz #define	__ieee754_pow	pow
391e1b61b5bSDavid Schultz #define	__ieee754_lgamma lgamma
392e1b61b5bSDavid Schultz #define	__ieee754_gamma	gamma
393e1b61b5bSDavid Schultz #define	__ieee754_lgamma_r lgamma_r
394e1b61b5bSDavid Schultz #define	__ieee754_gamma_r gamma_r
395e1b61b5bSDavid Schultz #define	__ieee754_log10	log10
396e1b61b5bSDavid Schultz #define	__ieee754_sinh	sinh
397e1b61b5bSDavid Schultz #define	__ieee754_hypot	hypot
398e1b61b5bSDavid Schultz #define	__ieee754_j0	j0
399e1b61b5bSDavid Schultz #define	__ieee754_j1	j1
400e1b61b5bSDavid Schultz #define	__ieee754_y0	y0
401e1b61b5bSDavid Schultz #define	__ieee754_y1	y1
402e1b61b5bSDavid Schultz #define	__ieee754_jn	jn
403e1b61b5bSDavid Schultz #define	__ieee754_yn	yn
404e1b61b5bSDavid Schultz #define	__ieee754_remainder remainder
405e1b61b5bSDavid Schultz #define	__ieee754_scalb	scalb
406e1b61b5bSDavid Schultz #define	__ieee754_sqrtf	sqrtf
407e1b61b5bSDavid Schultz #define	__ieee754_acosf	acosf
408e1b61b5bSDavid Schultz #define	__ieee754_acoshf acoshf
409e1b61b5bSDavid Schultz #define	__ieee754_logf	logf
410e1b61b5bSDavid Schultz #define	__ieee754_atanhf atanhf
411e1b61b5bSDavid Schultz #define	__ieee754_asinf	asinf
412e1b61b5bSDavid Schultz #define	__ieee754_atan2f atan2f
413e1b61b5bSDavid Schultz #define	__ieee754_expf	expf
414e1b61b5bSDavid Schultz #define	__ieee754_coshf	coshf
415e1b61b5bSDavid Schultz #define	__ieee754_fmodf	fmodf
416e1b61b5bSDavid Schultz #define	__ieee754_powf	powf
417e1b61b5bSDavid Schultz #define	__ieee754_lgammaf lgammaf
418e1b61b5bSDavid Schultz #define	__ieee754_gammaf gammaf
419e1b61b5bSDavid Schultz #define	__ieee754_lgammaf_r lgammaf_r
420e1b61b5bSDavid Schultz #define	__ieee754_gammaf_r gammaf_r
421e1b61b5bSDavid Schultz #define	__ieee754_log10f log10f
422177668d1SDavid Schultz #define	__ieee754_log2f log2f
423e1b61b5bSDavid Schultz #define	__ieee754_sinhf	sinhf
424e1b61b5bSDavid Schultz #define	__ieee754_hypotf hypotf
425e1b61b5bSDavid Schultz #define	__ieee754_j0f	j0f
426e1b61b5bSDavid Schultz #define	__ieee754_j1f	j1f
427e1b61b5bSDavid Schultz #define	__ieee754_y0f	y0f
428e1b61b5bSDavid Schultz #define	__ieee754_y1f	y1f
429e1b61b5bSDavid Schultz #define	__ieee754_jnf	jnf
430e1b61b5bSDavid Schultz #define	__ieee754_ynf	ynf
431e1b61b5bSDavid Schultz #define	__ieee754_remainderf remainderf
432e1b61b5bSDavid Schultz #define	__ieee754_scalbf scalbf
4333a8617a8SJordan K. Hubbard 
4343a8617a8SJordan K. Hubbard /* fdlibm kernel function */
435079299f7SDavid Schultz int	__kernel_rem_pio2(double*,double*,int,int,int);
436079299f7SDavid Schultz 
437079299f7SDavid Schultz /* double precision kernel functions */
4382b795b29SDimitry Andric #ifndef INLINE_REM_PIO2
439e02846ceSDavid Schultz int	__ieee754_rem_pio2(double,double*);
4402b795b29SDimitry Andric #endif
44169160b1eSDavid E. O'Brien double	__kernel_sin(double,double,int);
44269160b1eSDavid E. O'Brien double	__kernel_cos(double,double);
44369160b1eSDavid E. O'Brien double	__kernel_tan(double,double,int);
44412188b77SDavid Schultz double	__ldexp_exp(double,int);
44512188b77SDavid Schultz #ifdef _COMPLEX_H
44612188b77SDavid Schultz double complex __ldexp_cexp(double complex,int);
44712188b77SDavid Schultz #endif
4483a8617a8SJordan K. Hubbard 
449079299f7SDavid Schultz /* float precision kernel functions */
4502b795b29SDimitry Andric #ifndef INLINE_REM_PIO2F
45170d818a2SBruce Evans int	__ieee754_rem_pio2f(float,double*);
452b492f289SEd Schouten #endif
4532b795b29SDimitry Andric #ifndef INLINE_KERNEL_SINDF
45459aad933SBruce Evans float	__kernel_sindf(double);
455b492f289SEd Schouten #endif
4562b795b29SDimitry Andric #ifndef INLINE_KERNEL_COSDF
45759aad933SBruce Evans float	__kernel_cosdf(double);
458b492f289SEd Schouten #endif
4592b795b29SDimitry Andric #ifndef INLINE_KERNEL_TANDF
46094a5f9beSBruce Evans float	__kernel_tandf(double,int);
4612b795b29SDimitry Andric #endif
46212188b77SDavid Schultz float	__ldexp_expf(float,int);
46312188b77SDavid Schultz #ifdef _COMPLEX_H
46412188b77SDavid Schultz float complex __ldexp_cexpf(float complex,int);
46512188b77SDavid Schultz #endif
466079299f7SDavid Schultz 
467079299f7SDavid Schultz /* long double precision kernel functions */
468079299f7SDavid Schultz long double __kernel_sinl(long double, long double, int);
469079299f7SDavid Schultz long double __kernel_cosl(long double, long double);
470079299f7SDavid Schultz long double __kernel_tanl(long double, long double, int);
4713a8617a8SJordan K. Hubbard 
472ef1ee63eSAlexey Zelkin #endif /* !_MATH_PRIVATE_H_ */
473