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