1#ifndef _MATH_PRIVATE_H_ 2#error "Never use <math_ldbl.h> directly; include <math_private.h> instead." 3#endif 4 5/* A union which permits us to convert between a long double and 6 three 32 bit ints. */ 7 8typedef union 9{ 10 long double value; 11 struct 12 { 13 u_int32_t lsw; 14 u_int32_t msw; 15 int sign_exponent:16; 16 unsigned int empty1:16; 17 unsigned int empty0:32; 18 } parts; 19} ieee_long_double_shape_type; 20 21/* Get three 32 bit ints from a double. */ 22 23#define GET_LDOUBLE_WORDS(exp,ix0,ix1,d) \ 24do { \ 25 ieee_long_double_shape_type ew_u; \ 26 ew_u.value = (d); \ 27 (exp) = ew_u.parts.sign_exponent; \ 28 (ix0) = ew_u.parts.msw; \ 29 (ix1) = ew_u.parts.lsw; \ 30} while (0) 31 32/* Set a double from two 32 bit ints. */ 33 34#define SET_LDOUBLE_WORDS(d,exp,ix0,ix1) \ 35do { \ 36 ieee_long_double_shape_type iw_u; \ 37 iw_u.parts.sign_exponent = (exp); \ 38 iw_u.parts.msw = (ix0); \ 39 iw_u.parts.lsw = (ix1); \ 40 (d) = iw_u.value; \ 41} while (0) 42 43/* Get the more significant 32 bits of a long double mantissa. */ 44 45#define GET_LDOUBLE_MSW(v,d) \ 46do { \ 47 ieee_long_double_shape_type sh_u; \ 48 sh_u.value = (d); \ 49 (v) = sh_u.parts.msw; \ 50} while (0) 51 52/* Set the more significant 32 bits of a long double mantissa from an int. */ 53 54#define SET_LDOUBLE_MSW(d,v) \ 55do { \ 56 ieee_long_double_shape_type sh_u; \ 57 sh_u.value = (d); \ 58 sh_u.parts.msw = (v); \ 59 (d) = sh_u.value; \ 60} while (0) 61 62/* Get int from the exponent of a long double. */ 63 64#define GET_LDOUBLE_EXP(exp,d) \ 65do { \ 66 ieee_long_double_shape_type ge_u; \ 67 ge_u.value = (d); \ 68 (exp) = ge_u.parts.sign_exponent; \ 69} while (0) 70 71/* Set exponent of a long double from an int. */ 72 73#define SET_LDOUBLE_EXP(d,exp) \ 74do { \ 75 ieee_long_double_shape_type se_u; \ 76 se_u.value = (d); \ 77 se_u.parts.sign_exponent = (exp); \ 78 (d) = se_u.value; \ 79} while (0) 80