1169695Skan#include <ansidecl.h>
2169695Skan
3169695Skan#ifdef __IEEE_BIG_ENDIAN
4169695Skan
5169695Skantypedef union
6169695Skan{
7169695Skan  double value;
8169695Skan  struct
9169695Skan  {
10169695Skan    unsigned int sign : 1;
11169695Skan    unsigned int exponent: 11;
12169695Skan    unsigned int fraction0:4;
13169695Skan    unsigned int fraction1:16;
14169695Skan    unsigned int fraction2:16;
15169695Skan    unsigned int fraction3:16;
16169695Skan
17169695Skan  } number;
18169695Skan  struct
19169695Skan  {
20169695Skan    unsigned int sign : 1;
21169695Skan    unsigned int exponent: 11;
22169695Skan    unsigned int quiet:1;
23169695Skan    unsigned int function0:3;
24169695Skan    unsigned int function1:16;
25169695Skan    unsigned int function2:16;
26169695Skan    unsigned int function3:16;
27169695Skan  } nan;
28169695Skan  struct
29169695Skan  {
30169695Skan    unsigned long msw;
31169695Skan    unsigned long lsw;
32169695Skan  } parts;
33169695Skan    long aslong[2];
34169695Skan} __ieee_double_shape_type;
35169695Skan
36169695Skan#endif
37169695Skan
38169695Skan#ifdef __IEEE_LITTLE_ENDIAN
39169695Skan
40169695Skantypedef union
41169695Skan{
42169695Skan  double value;
43169695Skan  struct
44169695Skan  {
45169695Skan#ifdef __SMALL_BITFIELDS
46169695Skan    unsigned int fraction3:16;
47169695Skan    unsigned int fraction2:16;
48169695Skan    unsigned int fraction1:16;
49169695Skan    unsigned int fraction0: 4;
50169695Skan#else
51169695Skan    unsigned int fraction1:32;
52169695Skan    unsigned int fraction0:20;
53169695Skan#endif
54169695Skan    unsigned int exponent :11;
55169695Skan    unsigned int sign     : 1;
56169695Skan  } number;
57169695Skan  struct
58169695Skan  {
59169695Skan#ifdef __SMALL_BITFIELDS
60169695Skan    unsigned int function3:16;
61169695Skan    unsigned int function2:16;
62169695Skan    unsigned int function1:16;
63169695Skan    unsigned int function0:3;
64169695Skan#else
65169695Skan    unsigned int function1:32;
66169695Skan    unsigned int function0:19;
67169695Skan#endif
68169695Skan    unsigned int quiet:1;
69169695Skan    unsigned int exponent: 11;
70169695Skan    unsigned int sign : 1;
71169695Skan  } nan;
72169695Skan  struct
73169695Skan  {
74169695Skan    unsigned long lsw;
75169695Skan    unsigned long msw;
76169695Skan  } parts;
77169695Skan
78169695Skan  long aslong[2];
79169695Skan
80169695Skan} __ieee_double_shape_type;
81169695Skan
82169695Skan#endif
83169695Skan
84169695Skan#ifdef __IEEE_BIG_ENDIAN
85169695Skantypedef union
86169695Skan{
87169695Skan  float value;
88169695Skan  struct
89169695Skan  {
90169695Skan    unsigned int sign : 1;
91169695Skan    unsigned int exponent: 8;
92169695Skan    unsigned int fraction0: 7;
93169695Skan    unsigned int fraction1: 16;
94169695Skan  } number;
95169695Skan  struct
96169695Skan  {
97169695Skan    unsigned int sign:1;
98169695Skan    unsigned int exponent:8;
99169695Skan    unsigned int quiet:1;
100169695Skan    unsigned int function0:6;
101169695Skan    unsigned int function1:16;
102169695Skan  } nan;
103169695Skan  long p1;
104169695Skan
105169695Skan} __ieee_float_shape_type;
106169695Skan#endif
107169695Skan
108169695Skan#ifdef __IEEE_LITTLE_ENDIAN
109169695Skantypedef union
110169695Skan{
111169695Skan  float value;
112169695Skan  struct
113169695Skan  {
114169695Skan    unsigned int fraction0: 7;
115169695Skan    unsigned int fraction1: 16;
116169695Skan    unsigned int exponent: 8;
117169695Skan    unsigned int sign : 1;
118169695Skan  } number;
119169695Skan  struct
120169695Skan  {
121169695Skan    unsigned int function1:16;
122169695Skan    unsigned int function0:6;
123169695Skan    unsigned int quiet:1;
124169695Skan    unsigned int exponent:8;
125169695Skan    unsigned int sign:1;
126169695Skan  } nan;
127169695Skan  long p1;
128169695Skan
129169695Skan} __ieee_float_shape_type;
130169695Skan#endif
131169695Skan
132169695Skan#if defined(__IEEE_BIG_ENDIAN) || defined(__IEEE_LITTLE_ENDIAN)
133169695Skan
134169695Skandouble
135169695Skancopysign (double x, double y)
136169695Skan{
137169695Skan  __ieee_double_shape_type a,b;
138169695Skan  b.value = y;
139169695Skan  a.value = x;
140169695Skan  a.number.sign =b.number.sign;
141169695Skan  return a.value;
142169695Skan}
143169695Skan
144169695Skan#else
145169695Skan
146169695Skandouble
147169695Skancopysign (double x, double y)
148169695Skan{
149169695Skan  if ((x < 0 && y > 0) || (x > 0 && y < 0))
150169695Skan    return -x;
151169695Skan  return x;
152169695Skan}
153169695Skan
154169695Skan#endif
155