fixunssfsi.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:2k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* fixunssfsi() -- routine to convert a float to an unsigned  */
  2. /* Copyright 1984-1994 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01a,13sep94,ism  created.
  8. */
  9. /*
  10. DESCRIPTION
  11. This library contains the fixunssfsi() routine required by the GNU
  12. compiler.  This addition fixes SPR #2649.
  13. AUTHOR
  14. NOMANUAL
  15. */
  16. #include "vxWorks.h"
  17. /*******************************************************************************
  18. *
  19. * __fixunssfsi - truncate a float to an unsigned
  20. *
  21. * WARNING: This function is pass a float but we declare it a long so
  22. * we can fiddle with the bits.  If the value comes in on a floating
  23. * point register (such as with the sparc compiler), this aint gona work.
  24. *
  25. * The magic numbers 23 and 0x7f appear frequently. Read the ieee spec for
  26. * more info.
  27. */
  28. unsigned __fixunssfsi
  29.     (
  30.     long a /* this is really a float (yuk) */
  31.     )
  32.     {
  33.     int exp; /* the exponent inside the float */
  34.  
  35.     /*
  36.      * This handles numbers less than 1.0 including ALL negitive numbers.
  37.      */
  38.     if (a < (0x7f<<23))
  39.         return (0);
  40.     /*
  41.      * This handles all numbers to big.
  42.      */
  43.     if (a >= ((0x7f+32)<<23))
  44.         return (0xffffffff); /* return MAX_UINT */
  45.  
  46.     /*
  47.      * Get the exponent, then clear it out to leave just the mantissa.
  48.      */
  49.     exp = a>>23;
  50.     a &= 0x007fffff; /* ((1<<23) - 1) */
  51.     a |= 0x00800000; /* (1<<23) */
  52.  
  53.     /*
  54.      * Shift the mantissa to the correct place, if exp == (0x7f+23) then
  55.      * it is already at the right place.
  56.      */
  57.     if (exp > (0x7f+23))
  58.         a <<= (exp - (0x7f+23));
  59.     else if (exp < (0x7f+23))
  60.         a >>= ((0x7f+23) - exp);
  61.     return (a);
  62.     }