Annotation of gcc/math-68881.h, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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