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,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 );