Commit 75d62a585629cdc1ae0d530189653cb1d8d9c53c

Authored by j_mayer
1 parent b1e341eb

Add missing softfloat helpers.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2518 c046a42c-6fe2-441c-8c8c-71466251a162
fpu/softfloat-native.c
... ... @@ -59,11 +59,21 @@ float32 int32_to_float32(int v STATUS_PARAM)
59 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 67 float64 int32_to_float64(int v STATUS_PARAM)
63 68 {
64 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 77 #ifdef FLOATX80
68 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 84 {
75 85 return (float32)v;
76 86 }
  87 +float32 uint64_to_float32( uint64_t v STATUS_PARAM)
  88 +{
  89 + return (float32)v;
  90 +}
77 91 float64 int64_to_float64( int64_t v STATUS_PARAM)
78 92 {
79 93 return (float64)v;
80 94 }
  95 +float64 uint64_to_float64( uint64_t v STATUS_PARAM)
  96 +{
  97 + return (float64)v;
  98 +}
81 99 #ifdef FLOATX80
82 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 150 }
133 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 185 | Software IEC/IEEE single-precision operations.
137 186 *----------------------------------------------------------------------------*/
... ... @@ -218,6 +267,53 @@ float128 float64_to_float128( float64 a STATUS_PARAM)
218 267 }
219 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 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 99 | Software IEC/IEEE integer-to-floating-point conversion routines.
100 100 *----------------------------------------------------------------------------*/
101 101 float32 int32_to_float32( int STATUS_PARAM);
  102 +float32 uint32_to_float32( unsigned int STATUS_PARAM);
102 103 float64 int32_to_float64( int STATUS_PARAM);
  104 +float64 uint32_to_float64( unsigned int STATUS_PARAM);
103 105 #ifdef FLOATX80
104 106 floatx80 int32_to_floatx80( int STATUS_PARAM);
105 107 #endif
... ... @@ -107,7 +109,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM);
107 109 float128 int32_to_float128( int STATUS_PARAM);
108 110 #endif
109 111 float32 int64_to_float32( int64_t STATUS_PARAM);
  112 +float32 uint64_to_float32( uint64_t STATUS_PARAM);
110 113 float64 int64_to_float64( int64_t STATUS_PARAM);
  114 +float64 uint64_to_float64( uint64_t v STATUS_PARAM);
111 115 #ifdef FLOATX80
112 116 floatx80 int64_to_floatx80( int64_t STATUS_PARAM);
113 117 #endif
... ... @@ -120,6 +124,8 @@ float128 int64_to_float128( int64_t STATUS_PARAM);
120 124 *----------------------------------------------------------------------------*/
121 125 int float32_to_int32( float32 STATUS_PARAM);
122 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 129 int64_t float32_to_int64( float32 STATUS_PARAM);
124 130 int64_t float32_to_int64_round_to_zero( float32 STATUS_PARAM);
125 131 float64 float32_to_float64( float32 STATUS_PARAM);
... ... @@ -200,8 +206,12 @@ INLINE float32 float32_chs(float32 a)
200 206 *----------------------------------------------------------------------------*/
201 207 int float64_to_int32( float64 STATUS_PARAM );
202 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 211 int64_t float64_to_int64( float64 STATUS_PARAM );
204 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 215 float32 float64_to_float32( float64 STATUS_PARAM );
206 216 #ifdef FLOATX80
207 217 floatx80 float64_to_floatx80( float64 STATUS_PARAM );
... ...
fpu/softfloat.c
... ... @@ -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 1189 | Returns the result of converting the 64-bit two's complement integer `a'
1169 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 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 1214 #ifdef FLOATX80
1187 1215  
1188 1216 /*----------------------------------------------------------------------------
... ... @@ -5282,6 +5310,26 @@ unsigned int float64_to_uint32_round_to_zero( float64 a STATUS_PARAM )
5282 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 5333 #define COMPARE(s, nan_exp) \
5286 5334 INLINE int float ## s ## _compare_internal( float ## s a, float ## s b, \
5287 5335 int is_quiet STATUS_PARAM ) \
... ...
fpu/softfloat.h
... ... @@ -193,7 +193,9 @@ floatx80 int32_to_floatx80( int STATUS_PARAM );
193 193 float128 int32_to_float128( int STATUS_PARAM );
194 194 #endif
195 195 float32 int64_to_float32( int64_t STATUS_PARAM );
  196 +float32 uint64_to_float32( uint64_t STATUS_PARAM );
196 197 float64 int64_to_float64( int64_t STATUS_PARAM );
  198 +float64 uint64_to_float64( uint64_t STATUS_PARAM );
197 199 #ifdef FLOATX80
198 200 floatx80 int64_to_floatx80( int64_t STATUS_PARAM );
199 201 #endif
... ... @@ -258,6 +260,8 @@ unsigned int float64_to_uint32( float64 STATUS_PARAM );
258 260 unsigned int float64_to_uint32_round_to_zero( float64 STATUS_PARAM );
259 261 int64_t float64_to_int64( float64 STATUS_PARAM );
260 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 265 float32 float64_to_float32( float64 STATUS_PARAM );
262 266 #ifdef FLOATX80
263 267 floatx80 float64_to_floatx80( float64 STATUS_PARAM );
... ...