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