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