Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /****************************************************************************
  2. *
  3. *                            Open Watcom Project
  4. *
  5. *    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
  6. *
  7. *  ========================================================================
  8. *
  9. *    This file contains Original Code and/or Modifications of Original
  10. *    Code as defined in and that are subject to the Sybase Open Watcom
  11. *    Public License version 1.0 (the 'License'). You may not use this file
  12. *    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
  13. *    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
  14. *    provided with the Original Code and Modifications, and is also
  15. *    available at www.sybase.com/developer/opensource.
  16. *
  17. *    The Original Code and all software distributed under the License are
  18. *    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  19. *    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
  20. *    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
  21. *    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
  22. *    NON-INFRINGEMENT. Please see the License for the specific language
  23. *    governing rights and limitations under the License.
  24. *
  25. *  ========================================================================
  26. *
  27. * Description:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
  28. *               DESCRIBE IT HERE!
  29. *
  30. ****************************************************************************/
  31.  
  32.  
  33. #include "variety.h"
  34. #include <math.h>
  35. #include <float.h>
  36. #include "rtdata.h"
  37.  
  38. #if defined(__AXP__)
  39.  
  40. /*
  41.  * FPCR Trap Disable Flags
  42.  */
  43. #define FPCR_INEXACT        0x40000000
  44. #define FPCR_UNDERFLOW      0x20000000
  45. #define FPCR_OVERFLOW       0x00080000
  46. #define FPCR_ZERODIVIDE     0x00040000
  47. #define FPCR_INVALID        0x00020000
  48.  
  49. extern unsigned long _GetFPCR(void);
  50. extern void          _SetFPCR(unsigned long);
  51.  
  52. static unsigned int MapToCW(unsigned long fpcr)
  53. {
  54.     unsigned int cw;
  55.  
  56.     /*
  57.      * The rounding bits are identical but in the highword of the fpcr.
  58.      */
  59.     cw = (fpcr >> 16) & ~(_MCW_RC);
  60.  
  61.     if (fpcr & FPCR_INEXACT)
  62.         cw &= ~_EM_INEXACT;
  63.  
  64.     if (fpcr & FPCR_ZERODIVIDE)
  65.         cw &= ~_EM_ZERODIVIDE;
  66.  
  67.     if (fpcr & FPCR_OVERFLOW)
  68.         cw &= ~_EM_OVERFLOW;
  69.  
  70.     if (fpcr & FPCR_UNDERFLOW)
  71.         cw &= ~_EM_UNDERFLOW;
  72.  
  73.     if (fpcr & FPCR_INVALID)
  74.         cw &= ~_EM_INVALID;
  75.  
  76.     return cw;
  77. } /* MapToCW() */
  78.  
  79.  
  80. static unsigned long MapFromCW(unsigned int cw)
  81. {
  82.     unsigned long fpcr = 0L;
  83.  
  84.     /*
  85.      * The rounding bits are identical but in the highword of the fpcr.
  86.      */
  87.     fpcr = (cw & ~_MCW_RC) << 16;
  88.  
  89.     if (!(cw & _EM_INEXACT))
  90.         fpcr |= FPCR_INEXACT;
  91.  
  92.     if (!(cw & _EM_INVALID))
  93.         fpcr |= FPCR_INVALID;
  94.  
  95.     if (!(cw & _EM_ZERODIVIDE))
  96.         fpcr |= FPCR_ZERODIVIDE;
  97.  
  98.     if (!(cw & _EM_OVERFLOW))
  99.         fpcr |= FPCR_OVERFLOW;
  100.  
  101.     if (!(cw & _EM_UNDERFLOW))
  102.         fpcr |= FPCR_UNDERFLOW;
  103.  
  104.     return fpcr;
  105. } /* MapFromCW() */
  106. #endif
  107.  
  108.  
  109. _WCRTLINK unsigned _controlfp(unsigned new, unsigned mask)
  110. {
  111. #if defined(_M_IX86)
  112.     return _control87(new, mask);               /* JBS 99/09/16 */
  113. #elif defined(__AXP__)
  114.     unsigned int  cw;
  115.  
  116.     cw = MapToCW(_GetFPCR());
  117.  
  118.     if (mask)
  119.     {
  120.         cw = (cw & ~mask) | (new & mask);
  121.         _SetFPCR(MapFromCW(cw));
  122.     }
  123.  
  124.     return cw;
  125. #elif defined(__PPC__)
  126.     // No idea yet
  127.     return( 0 );
  128. #elif defined(__MIPS__)
  129.     // No idea yet either
  130.     return( 0 );
  131. #endif
  132. } /* _controlfp() */
  133.