Annotation of GNUtools/cc/math-68881.h, revision 1.1

1.1     ! root        1: /******************************************************************\
        !             2: *                                                                 *
        !             3: *  <math-68881.h>              last modified: 23 May 1992.        *
        !             4: *                                                                 *
        !             5: *  Copyright (C) 1989 by Matthew Self.                            *
        !             6: *  You may freely distribute verbatim copies of this software     *
        !             7: *  provided that this copyright notice is retained in all copies.  *
        !             8: *  You may distribute modifications to this software under the     *
        !             9: *  conditions above if you also clearly note such modifications    *
        !            10: *  with their author and date.                                    *
        !            11: *                                                                 *
        !            12: *  Note:  errno is not set to EDOM when domain errors occur for    *
        !            13: *  most of these functions.  Rather, it is assumed that the       *
        !            14: *  68881's OPERR exception will be enabled and handled            *
        !            15: *  appropriately by the        operating system.  Similarly, overflow     *
        !            16: *  and underflow do not set errno to ERANGE.                      *
        !            17: *                                                                 *
        !            18: *  Send bugs to Matthew Self ([email protected]).                   *
        !            19: *                                                                 *
        !            20: \******************************************************************/
        !            21: 
        !            22: /* This file is NOT a part of GCC, just distributed with it.  */
        !            23: 
        !            24: /* If you find this in GCC,
        !            25:    please send bug reports to [email protected].  */
        !            26: 
        !            27: /* Changed by Richard Stallman:
        !            28:    May 1993, add conditional to prevent multiple inclusion.
        !            29:    % inserted before a #.
        !            30:    New function `hypot' added.
        !            31:    Nans written in hex to avoid 0rnan.
        !            32:    May 1992, use %! for fpcr register.  Break lines before function names.
        !            33:    December 1989, add parens around `&' in pow.
        !            34:    November 1990, added alternate definition of HUGE_VAL for Sun.  */
        !            35: 
        !            36: /* Changed by Jim Wilson:
        !            37:    September 1993, Use #undef before HUGE_VAL instead of #ifdef/#endif.  */
        !            38: 
        !            39: #ifndef __math_68881
        !            40: #define __math_68881
        !            41: 
        !            42: #include <errno.h>
        !            43: 
        !            44: #undef HUGE_VAL
        !            45: #ifdef __sun__
        !            46: /* The Sun assembler fails to handle the hex constant in the usual defn.  */
        !            47: #define HUGE_VAL                                                       \
        !            48: ({                                                                     \
        !            49:   static union { int i[2]; double d; } u = { {0x7ff00000, 0} };                \
        !            50:   u.d;                                                                 \
        !            51: })
        !            52: #else
        !            53: #define HUGE_VAL                                                       \
        !            54: ({                                                                     \
        !            55:   double huge_val;                                                     \
        !            56:                                                                        \
        !            57:   __asm ("fmove%.d %#0x7ff0000000000000,%0"    /* Infinity */          \
        !            58:         : "=f" (huge_val)                                              \
        !            59:         : /* no inputs */);                                            \
        !            60:   huge_val;                                                            \
        !            61: })
        !            62: #endif
        !            63: 
        !            64: __inline static const double
        !            65: sin (double x)
        !            66: {
        !            67:   double value;
        !            68: 
        !            69:   __asm ("fsin%.x %1,%0"
        !            70:         : "=f" (value)
        !            71:         : "f" (x));
        !            72:   return value;
        !            73: }
        !            74: 
        !            75: __inline static const double
        !            76: cos (double x)
        !            77: {
        !            78:   double value;
        !            79: 
        !            80:   __asm ("fcos%.x %1,%0"
        !            81:         : "=f" (value)
        !            82:         : "f" (x));
        !            83:   return value;
        !            84: }
        !            85: 
        !            86: __inline static const double
        !            87: tan (double x)
        !            88: {
        !            89:   double value;
        !            90: 
        !            91:   __asm ("ftan%.x %1,%0"
        !            92:         : "=f" (value)
        !            93:         : "f" (x));
        !            94:   return value;
        !            95: }
        !            96: 
        !            97: __inline static const double
        !            98: asin (double x)
        !            99: {
        !           100:   double value;
        !           101: 
        !           102:   __asm ("fasin%.x %1,%0"
        !           103:         : "=f" (value)
        !           104:         : "f" (x));
        !           105:   return value;
        !           106: }
        !           107: 
        !           108: __inline static const double
        !           109: acos (double x)
        !           110: {
        !           111:   double value;
        !           112: 
        !           113:   __asm ("facos%.x %1,%0"
        !           114:         : "=f" (value)
        !           115:         : "f" (x));
        !           116:   return value;
        !           117: }
        !           118: 
        !           119: __inline static const double
        !           120: atan (double x)
        !           121: {
        !           122:   double value;
        !           123: 
        !           124:   __asm ("fatan%.x %1,%0"
        !           125:         : "=f" (value)
        !           126:         : "f" (x));
        !           127:   return value;
        !           128: }
        !           129: 
        !           130: __inline static const double
        !           131: atan2 (double y, double x)
        !           132: {
        !           133:   double pi, pi_over_2;
        !           134: 
        !           135:   __asm ("fmovecr%.x %#0,%0"           /* extended precision pi */
        !           136:         : "=f" (pi)
        !           137:         : /* no inputs */ );
        !           138:   __asm ("fscale%.b %#-1,%0"           /* no loss of accuracy */
        !           139:         : "=f" (pi_over_2)
        !           140:         : "0" (pi));
        !           141:   if (x > 0)
        !           142:     {
        !           143:       if (y > 0)
        !           144:        {
        !           145:          if (x > y)
        !           146:            return atan (y / x);
        !           147:          else
        !           148:            return pi_over_2 - atan (x / y);
        !           149:        }
        !           150:       else
        !           151:        {
        !           152:          if (x > -y)
        !           153:            return atan (y / x);
        !           154:          else
        !           155:            return - pi_over_2 - atan (x / y);
        !           156:        }
        !           157:     }
        !           158:   else
        !           159:     {
        !           160:       if (y < 0)
        !           161:        {
        !           162:          if (-x > -y)
        !           163:            return - pi + atan (y / x);
        !           164:          else
        !           165:            return - pi_over_2 - atan (x / y);
        !           166:        }
        !           167:       else
        !           168:        {
        !           169:          if (-x > y)
        !           170:            return pi + atan (y / x);
        !           171:          else if (y > 0)
        !           172:            return pi_over_2 - atan (x / y);
        !           173:          else
        !           174:            {
        !           175:              double value;
        !           176: 
        !           177:              errno = EDOM;
        !           178:              __asm ("fmove%.d %#0x7fffffffffffffff,%0"         /* quiet NaN */
        !           179:                     : "=f" (value)
        !           180:                     : /* no inputs */);
        !           181:              return value;
        !           182:            }
        !           183:        }
        !           184:     }
        !           185: }
        !           186: 
        !           187: __inline static const double
        !           188: sinh (double x)
        !           189: {
        !           190:   double value;
        !           191: 
        !           192:   __asm ("fsinh%.x %1,%0"
        !           193:         : "=f" (value)
        !           194:         : "f" (x));
        !           195:   return value;
        !           196: }
        !           197: 
        !           198: __inline static const double
        !           199: cosh (double x)
        !           200: {
        !           201:   double value;
        !           202: 
        !           203:   __asm ("fcosh%.x %1,%0"
        !           204:         : "=f" (value)
        !           205:         : "f" (x));
        !           206:   return value;
        !           207: }
        !           208: 
        !           209: __inline static const double
        !           210: tanh (double x)
        !           211: {
        !           212:   double value;
        !           213: 
        !           214:   __asm ("ftanh%.x %1,%0"
        !           215:         : "=f" (value)
        !           216:         : "f" (x));
        !           217:   return value;
        !           218: }
        !           219: 
        !           220: __inline static const double
        !           221: atanh (double x)
        !           222: {
        !           223:   double value;
        !           224: 
        !           225:   __asm ("fatanh%.x %1,%0"
        !           226:         : "=f" (value)
        !           227:         : "f" (x));
        !           228:   return value;
        !           229: }
        !           230: 
        !           231: __inline static const double
        !           232: exp (double x)
        !           233: {
        !           234:   double value;
        !           235: 
        !           236:   __asm ("fetox%.x %1,%0"
        !           237:         : "=f" (value)
        !           238:         : "f" (x));
        !           239:   return value;
        !           240: }
        !           241: 
        !           242: __inline static const double
        !           243: expm1 (double x)
        !           244: {
        !           245:   double value;
        !           246: 
        !           247:   __asm ("fetoxm1%.x %1,%0"
        !           248:         : "=f" (value)
        !           249:         : "f" (x));
        !           250:   return value;
        !           251: }
        !           252: 
        !           253: __inline static const double
        !           254: log (double x)
        !           255: {
        !           256:   double value;
        !           257: 
        !           258:   __asm ("flogn%.x %1,%0"
        !           259:         : "=f" (value)
        !           260:         : "f" (x));
        !           261:   return value;
        !           262: }
        !           263: 
        !           264: __inline static const double
        !           265: log1p (double x)
        !           266: {
        !           267:   double value;
        !           268: 
        !           269:   __asm ("flognp1%.x %1,%0"
        !           270:         : "=f" (value)
        !           271:         : "f" (x));
        !           272:   return value;
        !           273: }
        !           274: 
        !           275: __inline static const double
        !           276: log10 (double x)
        !           277: {
        !           278:   double value;
        !           279: 
        !           280:   __asm ("flog10%.x %1,%0"
        !           281:         : "=f" (value)
        !           282:         : "f" (x));
        !           283:   return value;
        !           284: }
        !           285: 
        !           286: __inline static const double
        !           287: sqrt (double x)
        !           288: {
        !           289:   double value;
        !           290: 
        !           291:   __asm ("fsqrt%.x %1,%0"
        !           292:         : "=f" (value)
        !           293:         : "f" (x));
        !           294:   return value;
        !           295: }
        !           296: 
        !           297: __inline static const double
        !           298: hypot (const double x, const double y)
        !           299: {
        !           300:   return sqrt (x*x + y*y);
        !           301: }
        !           302: 
        !           303: __inline static const double
        !           304: pow (const double x, const double y)
        !           305: {
        !           306:   if (x > 0)
        !           307:     return exp (y * log (x));
        !           308:   else if (x == 0)
        !           309:     {
        !           310:       if (y > 0)
        !           311:        return 0.0;
        !           312:       else
        !           313:        {
        !           314:          double value;
        !           315: 
        !           316:          errno = EDOM;
        !           317:          __asm ("fmove%.d %#0x7fffffffffffffff,%0"             /* quiet NaN */
        !           318:                 : "=f" (value)
        !           319:                 : /* no inputs */);
        !           320:          return value;
        !           321:        }
        !           322:     }
        !           323:   else
        !           324:     {
        !           325:       double temp;
        !           326: 
        !           327:       __asm ("fintrz%.x %1,%0"
        !           328:             : "=f" (temp)                      /* integer-valued float */
        !           329:             : "f" (y));
        !           330:       if (y == temp)
        !           331:         {
        !           332:          int i = (int) y;
        !           333:          
        !           334:          if ((i & 1) == 0)                     /* even */
        !           335:            return exp (y * log (-x));
        !           336:          else
        !           337:            return - exp (y * log (-x));
        !           338:         }
        !           339:       else
        !           340:         {
        !           341:          double value;
        !           342: 
        !           343:          errno = EDOM;
        !           344:          __asm ("fmove%.d %#0x7fffffffffffffff,%0"             /* quiet NaN */
        !           345:                 : "=f" (value)
        !           346:                 : /* no inputs */);
        !           347:          return value;
        !           348:         }
        !           349:     }
        !           350: }
        !           351: 
        !           352: __inline static const double
        !           353: fabs (double x)
        !           354: {
        !           355:   double value;
        !           356: 
        !           357:   __asm ("fabs%.x %1,%0"
        !           358:         : "=f" (value)
        !           359:         : "f" (x));
        !           360:   return value;
        !           361: }
        !           362: 
        !           363: __inline static const double
        !           364: ceil (double x)
        !           365: {
        !           366:   int rounding_mode, round_up;
        !           367:   double value;
        !           368: 
        !           369:   __asm volatile ("fmove%.l %!,%0"
        !           370:                  : "=dm" (rounding_mode)
        !           371:                  : /* no inputs */ );
        !           372:   round_up = rounding_mode | 0x30;
        !           373:   __asm volatile ("fmove%.l %0,%!"
        !           374:                  : /* no outputs */
        !           375:                  : "dmi" (round_up));
        !           376:   __asm volatile ("fint%.x %1,%0"
        !           377:                  : "=f" (value)
        !           378:                  : "f" (x));
        !           379:   __asm volatile ("fmove%.l %0,%!"
        !           380:                  : /* no outputs */
        !           381:                  : "dmi" (rounding_mode));
        !           382:   return value;
        !           383: }
        !           384: 
        !           385: __inline static const double
        !           386: floor (double x)
        !           387: {
        !           388:   int rounding_mode, round_down;
        !           389:   double value;
        !           390: 
        !           391:   __asm volatile ("fmove%.l %!,%0"
        !           392:                  : "=dm" (rounding_mode)
        !           393:                  : /* no inputs */ );
        !           394:   round_down = (rounding_mode & ~0x10)
        !           395:                | 0x20;
        !           396:   __asm volatile ("fmove%.l %0,%!"
        !           397:                  : /* no outputs */
        !           398:                  : "dmi" (round_down));
        !           399:   __asm volatile ("fint%.x %1,%0"
        !           400:                  : "=f" (value)
        !           401:                  : "f" (x));
        !           402:   __asm volatile ("fmove%.l %0,%!"
        !           403:                  : /* no outputs */
        !           404:                  : "dmi" (rounding_mode));
        !           405:   return value;
        !           406: }
        !           407: 
        !           408: __inline static const double
        !           409: rint (double x)
        !           410: {
        !           411:   int rounding_mode, round_nearest;
        !           412:   double value;
        !           413: 
        !           414:   __asm volatile ("fmove%.l %!,%0"
        !           415:                  : "=dm" (rounding_mode)
        !           416:                  : /* no inputs */ );
        !           417:   round_nearest = rounding_mode & ~0x30;
        !           418:   __asm volatile ("fmove%.l %0,%!"
        !           419:                  : /* no outputs */
        !           420:                  : "dmi" (round_nearest));
        !           421:   __asm volatile ("fint%.x %1,%0"
        !           422:                  : "=f" (value)
        !           423:                  : "f" (x));
        !           424:   __asm volatile ("fmove%.l %0,%!"
        !           425:                  : /* no outputs */
        !           426:                  : "dmi" (rounding_mode));
        !           427:   return value;
        !           428: }
        !           429: 
        !           430: __inline static const double
        !           431: fmod (double x, double y)
        !           432: {
        !           433:   double value;
        !           434: 
        !           435:   __asm ("fmod%.x %2,%0"
        !           436:         : "=f" (value)
        !           437:         : "0" (x),
        !           438:           "f" (y));
        !           439:   return value;
        !           440: }
        !           441: 
        !           442: __inline static const double
        !           443: drem (double x, double y)
        !           444: {
        !           445:   double value;
        !           446: 
        !           447:   __asm ("frem%.x %2,%0"
        !           448:         : "=f" (value)
        !           449:         : "0" (x),
        !           450:           "f" (y));
        !           451:   return value;
        !           452: }
        !           453: 
        !           454: __inline static const double
        !           455: scalb (double x, int n)
        !           456: {
        !           457:   double value;
        !           458: 
        !           459:   __asm ("fscale%.l %2,%0"
        !           460:         : "=f" (value)
        !           461:         : "0" (x),
        !           462:           "dmi" (n));
        !           463:   return value;
        !           464: }
        !           465: 
        !           466: __inline static double
        !           467: logb (double x)
        !           468: {
        !           469:   double exponent;
        !           470: 
        !           471:   __asm ("fgetexp%.x %1,%0"
        !           472:         : "=f" (exponent)
        !           473:         : "f" (x));
        !           474:   return exponent;
        !           475: }
        !           476: 
        !           477: __inline static const double
        !           478: ldexp (double x, int n)
        !           479: {
        !           480:   double value;
        !           481: 
        !           482:   __asm ("fscale%.l %2,%0"
        !           483:         : "=f" (value)
        !           484:         : "0" (x),
        !           485:           "dmi" (n));
        !           486:   return value;
        !           487: }
        !           488: 
        !           489: __inline static double
        !           490: frexp (double x, int *exp)
        !           491: {
        !           492:   double float_exponent;
        !           493:   int int_exponent;
        !           494:   double mantissa;
        !           495: 
        !           496:   __asm ("fgetexp%.x %1,%0"
        !           497:         : "=f" (float_exponent)        /* integer-valued float */
        !           498:         : "f" (x));
        !           499:   int_exponent = (int) float_exponent;
        !           500:   __asm ("fgetman%.x %1,%0"
        !           501:         : "=f" (mantissa)              /* 1.0 <= mantissa < 2.0 */
        !           502:         : "f" (x));
        !           503:   if (mantissa != 0)
        !           504:     {
        !           505:       __asm ("fscale%.b %#-1,%0"
        !           506:             : "=f" (mantissa)          /* mantissa /= 2.0 */
        !           507:             : "0" (mantissa));
        !           508:       int_exponent += 1;
        !           509:     }
        !           510:   *exp = int_exponent;
        !           511:   return mantissa;
        !           512: }
        !           513: 
        !           514: __inline static double
        !           515: modf (double x, double *ip)
        !           516: {
        !           517:   double temp;
        !           518: 
        !           519:   __asm ("fintrz%.x %1,%0"
        !           520:         : "=f" (temp)                  /* integer-valued float */
        !           521:         : "f" (x));
        !           522:   *ip = temp;
        !           523:   return x - temp;
        !           524: }
        !           525: 
        !           526: #endif /* not __math_68881 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.