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

unix.superglobalmegacorp.com

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