Subversion Repositories HelenOS-historic

Rev

Rev 857 | Rev 874 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 857 Rev 865
Line 205... Line 205...
205
    }
205
    }
206
    return _float32_to_uint32_helper(a);
206
    return _float32_to_uint32_helper(a);
207
}  
207
}  
208
 
208
 
209
 
209
 
-
 
210
/** Helping procedure for converting float64 to uint64
-
 
211
 * @param a floating point number in normalized form (no NaNs or Inf are checked )
-
 
212
 * @return unsigned integer
-
 
213
 */
-
 
214
static __u64 _float64_to_uint64_helper(float64 a)
-
 
215
{
-
 
216
    __u64 frac;
-
 
217
   
-
 
218
    if (a.parts.exp < FLOAT64_BIAS) {
-
 
219
        /*TODO: rounding*/
-
 
220
        return 0;
-
 
221
    }
-
 
222
   
-
 
223
    frac = a.parts.fraction;
-
 
224
   
-
 
225
    frac |= FLOAT64_HIDDEN_BIT_MASK;
-
 
226
    /* shift fraction to left so hidden bit will be the most significant bit */
-
 
227
    frac <<= 64 - FLOAT64_FRACTION_SIZE - 1;
-
 
228
 
-
 
229
    frac >>= 64 - (a.parts.exp - FLOAT64_BIAS) - 1;
-
 
230
    if ((a.parts.sign == 1) && (frac != 0)) {
-
 
231
        frac = ~frac;
-
 
232
        ++frac;
-
 
233
    }
-
 
234
   
-
 
235
    return frac;
-
 
236
}
-
 
237
 
-
 
238
/* Convert float to unsigned int64
-
 
239
 * FIXME: Im not sure what to return if overflow/underflow happens
-
 
240
 *  - now its the biggest or the smallest int
-
 
241
 */
-
 
242
__u64 float64_to_uint64(float64 a)
-
 
243
{
-
 
244
    if (isFloat64NaN(a)) {
-
 
245
        return MAX_UINT64;
-
 
246
    }
-
 
247
   
-
 
248
    if (isFloat64Infinity(a) || (a.parts.exp >= (64 + FLOAT64_BIAS)))  {
-
 
249
        if (a.parts.sign) {
-
 
250
            return MIN_UINT64;
-
 
251
        }
-
 
252
        return MAX_UINT64;
-
 
253
    }
-
 
254
   
-
 
255
    return _float64_to_uint64_helper(a);   
-
 
256
}
-
 
257
 
-
 
258
/* Convert float to signed int64
-
 
259
 * FIXME: Im not sure what to return if overflow/underflow happens
-
 
260
 *  - now its the biggest or the smallest int
-
 
261
 */
-
 
262
__s64 float64_to_int64(float64 a)
-
 
263
{
-
 
264
    if (isFloat64NaN(a)) {
-
 
265
        return MAX_INT64;
-
 
266
    }
-
 
267
   
-
 
268
    if (isFloat64Infinity(a) || (a.parts.exp >= (64 + FLOAT64_BIAS)))  {
-
 
269
        if (a.parts.sign) {
-
 
270
            return MIN_INT64;
-
 
271
        }
-
 
272
        return MAX_INT64;
-
 
273
    }
-
 
274
    return _float64_to_uint64_helper(a);
-
 
275
}  
-
 
276
 
-
 
277
 
-
 
278
 
-
 
279
 
-
 
280
 
-
 
281
/** Helping procedure for converting float32 to uint64
-
 
282
 * @param a floating point number in normalized form (no NaNs or Inf are checked )
-
 
283
 * @return unsigned integer
-
 
284
 */
-
 
285
static __u64 _float32_to_uint64_helper(float32 a)
-
 
286
{
-
 
287
    __u64 frac;
-
 
288
   
-
 
289
    if (a.parts.exp < FLOAT32_BIAS) {
-
 
290
        /*TODO: rounding*/
-
 
291
        return 0;
-
 
292
    }
-
 
293
   
-
 
294
    frac = a.parts.fraction;
-
 
295
   
-
 
296
    frac |= FLOAT32_HIDDEN_BIT_MASK;
-
 
297
    /* shift fraction to left so hidden bit will be the most significant bit */
-
 
298
    frac <<= 64 - FLOAT32_FRACTION_SIZE - 1;
-
 
299
 
-
 
300
    frac >>= 64 - (a.parts.exp - FLOAT32_BIAS) - 1;
-
 
301
    if ((a.parts.sign == 1) && (frac != 0)) {
-
 
302
        frac = ~frac;
-
 
303
        ++frac;
-
 
304
    }
-
 
305
   
-
 
306
    return frac;
-
 
307
}
-
 
308
 
-
 
309
/* Convert float to unsigned int64
-
 
310
 * FIXME: Im not sure what to return if overflow/underflow happens
-
 
311
 *  - now its the biggest or the smallest int
-
 
312
 */
-
 
313
__u64 float32_to_uint64(float32 a)
-
 
314
{
-
 
315
    if (isFloat32NaN(a)) {
-
 
316
        return MAX_UINT64;
-
 
317
    }
-
 
318
   
-
 
319
    if (isFloat32Infinity(a) || (a.parts.exp >= (64 + FLOAT32_BIAS)))  {
-
 
320
        if (a.parts.sign) {
-
 
321
            return MIN_UINT64;
-
 
322
        }
-
 
323
        return MAX_UINT64;
-
 
324
    }
-
 
325
   
-
 
326
    return _float32_to_uint64_helper(a);   
-
 
327
}
-
 
328
 
-
 
329
/* Convert float to signed int64
-
 
330
 * FIXME: Im not sure what to return if overflow/underflow happens
-
 
331
 *  - now its the biggest or the smallest int
-
 
332
 */
-
 
333
__s64 float32_to_int64(float32 a)
-
 
334
{
-
 
335
    if (isFloat32NaN(a)) {
-
 
336
        return MAX_INT64;
-
 
337
    }
-
 
338
   
-
 
339
    if (isFloat32Infinity(a) || (a.parts.exp >= (64 + FLOAT32_BIAS)))  {
-
 
340
        if (a.parts.sign) {
-
 
341
            return (MIN_INT64);
-
 
342
        }
-
 
343
        return MAX_INT64;
-
 
344
    }
-
 
345
    return _float32_to_uint64_helper(a);
-
 
346
}  
-
 
347
 
-
 
348
 
-
 
349
/* Convert float64 to unsigned int32
-
 
350
 * FIXME: Im not sure what to return if overflow/underflow happens
-
 
351
 *  - now its the biggest or the smallest int
-
 
352
 */
-
 
353
__u32 float64_to_uint32(float64 a)
-
 
354
{
-
 
355
    if (isFloat64NaN(a)) {
-
 
356
        return MAX_UINT32;
-
 
357
    }
-
 
358
   
-
 
359
    if (isFloat64Infinity(a) || (a.parts.exp >= (32 + FLOAT64_BIAS)))  {
-
 
360
        if (a.parts.sign) {
-
 
361
            return MIN_UINT32;
-
 
362
        }
-
 
363
        return MAX_UINT32;
-
 
364
    }
-
 
365
   
-
 
366
    return (__u32)_float64_to_uint64_helper(a);
-
 
367
}
-
 
368
 
-
 
369
/* Convert float64 to signed int32
-
 
370
 * FIXME: Im not sure what to return if overflow/underflow happens
-
 
371
 *  - now its the biggest or the smallest int
-
 
372
 */
-
 
373
__s32 float64_to_int32(float64 a)
-
 
374
{
-
 
375
    if (isFloat64NaN(a)) {
-
 
376
        return MAX_INT32;
-
 
377
    }
-
 
378
   
-
 
379
    if (isFloat64Infinity(a) || (a.parts.exp >= (32 + FLOAT64_BIAS)))  {
-
 
380
        if (a.parts.sign) {
-
 
381
            return MIN_INT32;
-
 
382
        }
-
 
383
        return MAX_INT32;
-
 
384
    }
-
 
385
    return (__s32)_float64_to_uint64_helper(a);
-
 
386
}  
-
 
387
 
210
 
388