xref: /haiku/src/system/libroot/posix/glibc/include/arch/x86_64/math_ldbl.h (revision 25a7b01d15612846f332751841da3579db313082)
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 
8 typedef 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)			\
24 do {								\
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)			\
35 do {								\
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)					\
46 do {								\
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)					\
55 do {								\
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)					\
65 do {								\
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)					\
74 do {								\
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