1#include <ansidecl.h>
2
3#ifdef __IEEE_BIG_ENDIAN
4
5typedef union
6{
7  double value;
8  struct
9  {
10    unsigned int sign : 1;
11    unsigned int exponent: 11;
12    unsigned int fraction0:4;
13    unsigned int fraction1:16;
14    unsigned int fraction2:16;
15    unsigned int fraction3:16;
16
17  } number;
18  struct
19  {
20    unsigned int sign : 1;
21    unsigned int exponent: 11;
22    unsigned int quiet:1;
23    unsigned int function0:3;
24    unsigned int function1:16;
25    unsigned int function2:16;
26    unsigned int function3:16;
27  } nan;
28  struct
29  {
30    unsigned long msw;
31    unsigned long lsw;
32  } parts;
33    long aslong[2];
34} __ieee_double_shape_type;
35
36#endif
37
38#ifdef __IEEE_LITTLE_ENDIAN
39
40typedef union
41{
42  double value;
43  struct
44  {
45#ifdef __SMALL_BITFIELDS
46    unsigned int fraction3:16;
47    unsigned int fraction2:16;
48    unsigned int fraction1:16;
49    unsigned int fraction0: 4;
50#else
51    unsigned int fraction1:32;
52    unsigned int fraction0:20;
53#endif
54    unsigned int exponent :11;
55    unsigned int sign     : 1;
56  } number;
57  struct
58  {
59#ifdef __SMALL_BITFIELDS
60    unsigned int function3:16;
61    unsigned int function2:16;
62    unsigned int function1:16;
63    unsigned int function0:3;
64#else
65    unsigned int function1:32;
66    unsigned int function0:19;
67#endif
68    unsigned int quiet:1;
69    unsigned int exponent: 11;
70    unsigned int sign : 1;
71  } nan;
72  struct
73  {
74    unsigned long lsw;
75    unsigned long msw;
76  } parts;
77
78  long aslong[2];
79
80} __ieee_double_shape_type;
81
82#endif
83
84#ifdef __IEEE_BIG_ENDIAN
85typedef union
86{
87  float value;
88  struct
89  {
90    unsigned int sign : 1;
91    unsigned int exponent: 8;
92    unsigned int fraction0: 7;
93    unsigned int fraction1: 16;
94  } number;
95  struct
96  {
97    unsigned int sign:1;
98    unsigned int exponent:8;
99    unsigned int quiet:1;
100    unsigned int function0:6;
101    unsigned int function1:16;
102  } nan;
103  long p1;
104
105} __ieee_float_shape_type;
106#endif
107
108#ifdef __IEEE_LITTLE_ENDIAN
109typedef union
110{
111  float value;
112  struct
113  {
114    unsigned int fraction0: 7;
115    unsigned int fraction1: 16;
116    unsigned int exponent: 8;
117    unsigned int sign : 1;
118  } number;
119  struct
120  {
121    unsigned int function1:16;
122    unsigned int function0:6;
123    unsigned int quiet:1;
124    unsigned int exponent:8;
125    unsigned int sign:1;
126  } nan;
127  long p1;
128
129} __ieee_float_shape_type;
130#endif
131
132#if defined(__IEEE_BIG_ENDIAN) || defined(__IEEE_LITTLE_ENDIAN)
133
134double
135copysign (double x, double y)
136{
137  __ieee_double_shape_type a,b;
138  b.value = y;
139  a.value = x;
140  a.number.sign =b.number.sign;
141  return a.value;
142}
143
144#else
145
146double
147copysign (double x, double y)
148{
149  if ((x < 0 && y > 0) || (x > 0 && y < 0))
150    return -x;
151  return x;
152}
153
154#endif
155