Mercurial > hg > CbC > CbC_gcc
comparison libiberty/copysign.c @ 0:a06113de4d67
first commit
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2009 14:47:48 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:a06113de4d67 |
---|---|
1 #include <ansidecl.h> | |
2 | |
3 #ifdef __IEEE_BIG_ENDIAN | |
4 | |
5 typedef 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 | |
40 typedef 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 | |
85 typedef 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 | |
109 typedef 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 | |
134 double | |
135 copysign (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 | |
146 double | |
147 copysign (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 |