Commit 75d62a585629cdc1ae0d530189653cb1d8d9c53c
1 parent
b1e341eb
Add missing softfloat helpers.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2518 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
158 additions
and
0 deletions
fpu/softfloat-native.c
@@ -59,11 +59,21 @@ float32 int32_to_float32(int v STATUS_PARAM) | @@ -59,11 +59,21 @@ float32 int32_to_float32(int v STATUS_PARAM) | ||
59 | return (float32)v; | 59 | return (float32)v; |
60 | } | 60 | } |
61 | 61 | ||
62 | +float32 uint32_to_float32(unsigned int v STATUS_PARAM) | ||
63 | +{ | ||
64 | + return (float32)v; | ||
65 | +} | ||
66 | + | ||
62 | float64 int32_to_float64(int v STATUS_PARAM) | 67 | float64 int32_to_float64(int v STATUS_PARAM) |
63 | { | 68 | { |
64 | return (float64)v; | 69 | return (float64)v; |
65 | } | 70 | } |
66 | 71 | ||
72 | +float64 uint32_to_float64(unsigned int v STATUS_PARAM) | ||
73 | +{ | ||
74 | + return (float64)v; | ||
75 | +} | ||
76 | + | ||
67 | #ifdef FLOATX80 | 77 | #ifdef FLOATX80 |
68 | floatx80 int32_to_floatx80(int v STATUS_PARAM) | 78 | floatx80 int32_to_floatx80(int v STATUS_PARAM) |
69 | { | 79 | { |
@@ -74,10 +84,18 @@ float32 int64_to_float32( int64_t v STATUS_PARAM) | @@ -74,10 +84,18 @@ float32 int64_to_float32( int64_t v STATUS_PARAM) | ||
74 | { | 84 | { |
75 | return (float32)v; | 85 | return (float32)v; |
76 | } | 86 | } |
87 | +float32 uint64_to_float32( uint64_t v STATUS_PARAM) | ||
88 | +{ | ||
89 | + return (float32)v; | ||
90 | +} | ||
77 | float64 int64_to_float64( int64_t v STATUS_PARAM) | 91 | float64 int64_to_float64( int64_t v STATUS_PARAM) |
78 | { | 92 | { |
79 | return (float64)v; | 93 | return (float64)v; |
80 | } | 94 | } |
95 | +float64 uint64_to_float64( uint64_t v STATUS_PARAM) | ||
96 | +{ | ||
97 | + return (float64)v; | ||
98 | +} | ||
81 | #ifdef FLOATX80 | 99 | #ifdef FLOATX80 |
82 | floatx80 int64_to_floatx80( int64_t v STATUS_PARAM) | 100 | floatx80 int64_to_floatx80( int64_t v STATUS_PARAM) |
83 | { | 101 | { |
@@ -132,6 +150,37 @@ floatx80 float32_to_floatx80( float32 a STATUS_PARAM) | @@ -132,6 +150,37 @@ floatx80 float32_to_floatx80( float32 a STATUS_PARAM) | ||
132 | } | 150 | } |
133 | #endif | 151 | #endif |
134 | 152 | ||
153 | +unsigned int float32_to_uint32( float32 a STATUS_PARAM) | ||
154 | +{ | ||
155 | + int64_t v; | ||
156 | + unsigned int res; | ||
157 | + | ||
158 | + v = llrintf(a); | ||
159 | + if (v < 0) { | ||
160 | + res = 0; | ||
161 | + } else if (v > 0xffffffff) { | ||
162 | + res = 0xffffffff; | ||
163 | + } else { | ||
164 | + res = v; | ||
165 | + } | ||
166 | + return res; | ||
167 | +} | ||
168 | +unsigned int float32_to_uint32_round_to_zero( float32 a STATUS_PARAM) | ||
169 | +{ | ||
170 | + int64_t v; | ||
171 | + unsigned int res; | ||
172 | + | ||
173 | + v = (int64_t)a; | ||
174 | + if (v < 0) { | ||
175 | + res = 0; | ||
176 | + } else if (v > 0xffffffff) { | ||
177 | + res = 0xffffffff; | ||
178 | + } else { | ||
179 | + res = v; | ||
180 | + } | ||
181 | + return res; | ||
182 | +} | ||
183 | + | ||
135 | /*---------------------------------------------------------------------------- | 184 | /*---------------------------------------------------------------------------- |
136 | | Software IEC/IEEE single-precision operations. | 185 | | Software IEC/IEEE single-precision operations. |
137 | *----------------------------------------------------------------------------*/ | 186 | *----------------------------------------------------------------------------*/ |
@@ -218,6 +267,53 @@ float128 float64_to_float128( float64 a STATUS_PARAM) | @@ -218,6 +267,53 @@ float128 float64_to_float128( float64 a STATUS_PARAM) | ||
218 | } | 267 | } |
219 | #endif | 268 | #endif |
220 | 269 | ||
270 | +unsigned int float64_to_uint32( float64 a STATUS_PARAM) | ||
271 | +{ | ||
272 | + int64_t v; | ||
273 | + unsigned int res; | ||
274 | + | ||
275 | + v = llrint(a); | ||
276 | + if (v < 0) { | ||
277 | + res = 0; | ||
278 | + } else if (v > 0xffffffff) { | ||
279 | + res = 0xffffffff; | ||
280 | + } else { | ||
281 | + res = v; | ||
282 | + } | ||
283 | + return res; | ||
284 | +} | ||
285 | +unsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM) | ||
286 | +{ | ||
287 | + int64_t v; | ||
288 | + unsigned int res; | ||
289 | + | ||
290 | + v = (int64_t)a; | ||
291 | + if (v < 0) { | ||
292 | + res = 0; | ||
293 | + } else if (v > 0xffffffff) { | ||
294 | + res = 0xffffffff; | ||
295 | + } else { | ||
296 | + res = v; | ||
297 | + } | ||
298 | + return res; | ||
299 | +} | ||
300 | +uint64_t float64_to_uint64 (float64 a STATUS_PARAM) | ||
301 | +{ | ||
302 | + int64_t v; | ||
303 | + | ||
304 | + v = llrint(a + (float64)INT64_MIN); | ||
305 | + | ||
306 | + return v - INT64_MIN; | ||
307 | +} | ||
308 | +uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) | ||
309 | +{ | ||
310 | + int64_t v; | ||
311 | + | ||
312 | + v = (int64_t)(a + (float64)INT64_MIN); | ||
313 | + | ||
314 | + return v - INT64_MIN; | ||
315 | +} | ||
316 | + | ||
221 | /*---------------------------------------------------------------------------- | 317 | /*---------------------------------------------------------------------------- |
222 | | Software IEC/IEEE double-precision operations. | 318 | | Software IEC/IEEE double-precision operations. |
223 | *----------------------------------------------------------------------------*/ | 319 | *----------------------------------------------------------------------------*/ |
fpu/softfloat-native.h
@@ -99,7 +99,9 @@ void set_floatx80_rounding_precision(int val STATUS_PARAM); | @@ -99,7 +99,9 @@ void set_floatx80_rounding_precision(int val STATUS_PARAM); | ||
99 | | Software IEC/IEEE integer-to-floating-point conversion routines. | 99 | | Software IEC/IEEE integer-to-floating-point conversion routines. |
100 | *----------------------------------------------------------------------------*/ | 100 | *----------------------------------------------------------------------------*/ |
101 | float32 int32_to_float32( int STATUS_PARAM); | 101 | float32 int32_to_float32( int STATUS_PARAM); |
102 | +float32 uint32_to_float32( unsigned int STATUS_PARAM); | ||
102 | float64 int32_to_float64( int STATUS_PARAM); | 103 | float64 int32_to_float64( int STATUS_PARAM); |
104 | +float64 uint32_to_float64( unsigned int STATUS_PARAM); | ||
103 | #ifdef FLOATX80 | 105 | #ifdef FLOATX80 |
104 | floatx80 int32_to_floatx80( int STATUS_PARAM); | 106 | floatx80 int32_to_floatx80( int STATUS_PARAM); |
105 | #endif | 107 | #endif |
@@ -107,7 +109,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM); | @@ -107,7 +109,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM); | ||
107 | float128 int32_to_float128( int STATUS_PARAM); | 109 | float128 int32_to_float128( int STATUS_PARAM); |
108 | #endif | 110 | #endif |
109 | float32 int64_to_float32( int64_t STATUS_PARAM); | 111 | float32 int64_to_float32( int64_t STATUS_PARAM); |
112 | +float32 uint64_to_float32( uint64_t STATUS_PARAM); | ||
110 | float64 int64_to_float64( int64_t STATUS_PARAM); | 113 | float64 int64_to_float64( int64_t STATUS_PARAM); |
114 | +float64 uint64_to_float64( uint64_t v STATUS_PARAM); | ||
111 | #ifdef FLOATX80 | 115 | #ifdef FLOATX80 |
112 | floatx80 int64_to_floatx80( int64_t STATUS_PARAM); | 116 | floatx80 int64_to_floatx80( int64_t STATUS_PARAM); |
113 | #endif | 117 | #endif |
@@ -120,6 +124,8 @@ float128 int64_to_float128( int64_t STATUS_PARAM); | @@ -120,6 +124,8 @@ float128 int64_to_float128( int64_t STATUS_PARAM); | ||
120 | *----------------------------------------------------------------------------*/ | 124 | *----------------------------------------------------------------------------*/ |
121 | int float32_to_int32( float32 STATUS_PARAM); | 125 | int float32_to_int32( float32 STATUS_PARAM); |
122 | int float32_to_int32_round_to_zero( float32 STATUS_PARAM); | 126 | int float32_to_int32_round_to_zero( float32 STATUS_PARAM); |
127 | +unsigned int float32_to_uint32( float32 a STATUS_PARAM); | ||
128 | +unsigned int float32_to_uint32_round_to_zero( float32 a STATUS_PARAM); | ||
123 | int64_t float32_to_int64( float32 STATUS_PARAM); | 129 | int64_t float32_to_int64( float32 STATUS_PARAM); |
124 | int64_t float32_to_int64_round_to_zero( float32 STATUS_PARAM); | 130 | int64_t float32_to_int64_round_to_zero( float32 STATUS_PARAM); |
125 | float64 float32_to_float64( float32 STATUS_PARAM); | 131 | float64 float32_to_float64( float32 STATUS_PARAM); |
@@ -200,8 +206,12 @@ INLINE float32 float32_chs(float32 a) | @@ -200,8 +206,12 @@ INLINE float32 float32_chs(float32 a) | ||
200 | *----------------------------------------------------------------------------*/ | 206 | *----------------------------------------------------------------------------*/ |
201 | int float64_to_int32( float64 STATUS_PARAM ); | 207 | int float64_to_int32( float64 STATUS_PARAM ); |
202 | int float64_to_int32_round_to_zero( float64 STATUS_PARAM ); | 208 | int float64_to_int32_round_to_zero( float64 STATUS_PARAM ); |
209 | +unsigned int float64_to_uint32( float64 STATUS_PARAM ); | ||
210 | +unsigned int float64_to_uint32_round_to_zero( float64 STATUS_PARAM ); | ||
203 | int64_t float64_to_int64( float64 STATUS_PARAM ); | 211 | int64_t float64_to_int64( float64 STATUS_PARAM ); |
204 | int64_t float64_to_int64_round_to_zero( float64 STATUS_PARAM ); | 212 | int64_t float64_to_int64_round_to_zero( float64 STATUS_PARAM ); |
213 | +uint64_t float64_to_uint64( float64 STATUS_PARAM ); | ||
214 | +uint64_t float64_to_uint64_round_to_zero( float64 STATUS_PARAM ); | ||
205 | float32 float64_to_float32( float64 STATUS_PARAM ); | 215 | float32 float64_to_float32( float64 STATUS_PARAM ); |
206 | #ifdef FLOATX80 | 216 | #ifdef FLOATX80 |
207 | floatx80 float64_to_floatx80( float64 STATUS_PARAM ); | 217 | floatx80 float64_to_floatx80( float64 STATUS_PARAM ); |
fpu/softfloat.c
@@ -1164,6 +1164,27 @@ float32 int64_to_float32( int64 a STATUS_PARAM ) | @@ -1164,6 +1164,27 @@ float32 int64_to_float32( int64 a STATUS_PARAM ) | ||
1164 | 1164 | ||
1165 | } | 1165 | } |
1166 | 1166 | ||
1167 | +float64 uint64_to_float32( uint64 a STATUS_PARAM ) | ||
1168 | +{ | ||
1169 | + int8 shiftCount; | ||
1170 | + | ||
1171 | + if ( a == 0 ) return 0; | ||
1172 | + shiftCount = countLeadingZeros64( a ) - 40; | ||
1173 | + if ( 0 <= shiftCount ) { | ||
1174 | + return packFloat32( 1 > 0, 0x95 - shiftCount, a<<shiftCount ); | ||
1175 | + } | ||
1176 | + else { | ||
1177 | + shiftCount += 7; | ||
1178 | + if ( shiftCount < 0 ) { | ||
1179 | + shift64RightJamming( a, - shiftCount, &a ); | ||
1180 | + } | ||
1181 | + else { | ||
1182 | + a <<= shiftCount; | ||
1183 | + } | ||
1184 | + return roundAndPackFloat32( 1 > 0, 0x9C - shiftCount, a STATUS_VAR ); | ||
1185 | + } | ||
1186 | +} | ||
1187 | + | ||
1167 | /*---------------------------------------------------------------------------- | 1188 | /*---------------------------------------------------------------------------- |
1168 | | Returns the result of converting the 64-bit two's complement integer `a' | 1189 | | Returns the result of converting the 64-bit two's complement integer `a' |
1169 | | to the double-precision floating-point format. The conversion is performed | 1190 | | to the double-precision floating-point format. The conversion is performed |
@@ -1183,6 +1204,13 @@ float64 int64_to_float64( int64 a STATUS_PARAM ) | @@ -1183,6 +1204,13 @@ float64 int64_to_float64( int64 a STATUS_PARAM ) | ||
1183 | 1204 | ||
1184 | } | 1205 | } |
1185 | 1206 | ||
1207 | +float64 uint64_to_float64( uint64 a STATUS_PARAM ) | ||
1208 | +{ | ||
1209 | + if ( a == 0 ) return 0; | ||
1210 | + return normalizeRoundAndPackFloat64( 0, 0x43C, a STATUS_VAR ); | ||
1211 | + | ||
1212 | +} | ||
1213 | + | ||
1186 | #ifdef FLOATX80 | 1214 | #ifdef FLOATX80 |
1187 | 1215 | ||
1188 | /*---------------------------------------------------------------------------- | 1216 | /*---------------------------------------------------------------------------- |
@@ -5282,6 +5310,26 @@ unsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM ) | @@ -5282,6 +5310,26 @@ unsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM ) | ||
5282 | return res; | 5310 | return res; |
5283 | } | 5311 | } |
5284 | 5312 | ||
5313 | +uint64_t float64_to_uint64 (float64 a STATUS_PARAM) | ||
5314 | +{ | ||
5315 | + int64_t v; | ||
5316 | + | ||
5317 | + v = int64_to_float64(INT64_MIN STATUS_VAR); | ||
5318 | + v = float64_to_int64((a + v) STATUS_VAR); | ||
5319 | + | ||
5320 | + return v - INT64_MIN; | ||
5321 | +} | ||
5322 | + | ||
5323 | +uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) | ||
5324 | +{ | ||
5325 | + int64_t v; | ||
5326 | + | ||
5327 | + v = int64_to_float64(INT64_MIN STATUS_VAR); | ||
5328 | + v = float64_to_int64_round_to_zero((a + v) STATUS_VAR); | ||
5329 | + | ||
5330 | + return v - INT64_MIN; | ||
5331 | +} | ||
5332 | + | ||
5285 | #define COMPARE(s, nan_exp) \ | 5333 | #define COMPARE(s, nan_exp) \ |
5286 | INLINE int float ## s ## _compare_internal( float ## s a, float ## s b, \ | 5334 | INLINE int float ## s ## _compare_internal( float ## s a, float ## s b, \ |
5287 | int is_quiet STATUS_PARAM ) \ | 5335 | int is_quiet STATUS_PARAM ) \ |
fpu/softfloat.h
@@ -193,7 +193,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM ); | @@ -193,7 +193,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM ); | ||
193 | float128 int32_to_float128( int STATUS_PARAM ); | 193 | float128 int32_to_float128( int STATUS_PARAM ); |
194 | #endif | 194 | #endif |
195 | float32 int64_to_float32( int64_t STATUS_PARAM ); | 195 | float32 int64_to_float32( int64_t STATUS_PARAM ); |
196 | +float32 uint64_to_float32( uint64_t STATUS_PARAM ); | ||
196 | float64 int64_to_float64( int64_t STATUS_PARAM ); | 197 | float64 int64_to_float64( int64_t STATUS_PARAM ); |
198 | +float64 uint64_to_float64( uint64_t STATUS_PARAM ); | ||
197 | #ifdef FLOATX80 | 199 | #ifdef FLOATX80 |
198 | floatx80 int64_to_floatx80( int64_t STATUS_PARAM ); | 200 | floatx80 int64_to_floatx80( int64_t STATUS_PARAM ); |
199 | #endif | 201 | #endif |
@@ -258,6 +260,8 @@ unsigned int float64_to_uint32( float64 STATUS_PARAM ); | @@ -258,6 +260,8 @@ unsigned int float64_to_uint32( float64 STATUS_PARAM ); | ||
258 | unsigned int float64_to_uint32_round_to_zero( float64 STATUS_PARAM ); | 260 | unsigned int float64_to_uint32_round_to_zero( float64 STATUS_PARAM ); |
259 | int64_t float64_to_int64( float64 STATUS_PARAM ); | 261 | int64_t float64_to_int64( float64 STATUS_PARAM ); |
260 | int64_t float64_to_int64_round_to_zero( float64 STATUS_PARAM ); | 262 | int64_t float64_to_int64_round_to_zero( float64 STATUS_PARAM ); |
263 | +uint64_t float64_to_uint64 (float64 a STATUS_PARAM); | ||
264 | +uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM); | ||
261 | float32 float64_to_float32( float64 STATUS_PARAM ); | 265 | float32 float64_to_float32( float64 STATUS_PARAM ); |
262 | #ifdef FLOATX80 | 266 | #ifdef FLOATX80 |
263 | floatx80 float64_to_floatx80( float64 STATUS_PARAM ); | 267 | floatx80 float64_to_floatx80( float64 STATUS_PARAM ); |