Annotation of coherent/b/kernel/emulator/poly_2xm1.c, revision 1.1.1.1

1.1       root        1: /*---------------------------------------------------------------------------+
                      2:  |  poly_2xm1.c                                                              |
                      3:  |                                                                           |
                      4:  | Function to compute 2^x-1 by a polynomial approximation.                  |
                      5:  |                                                                           |
                      6:  | Copyright (C) 1992    W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
                      7:  |                       Australia.  E-mail [email protected]    |
                      8:  |                                                                           |
                      9:  |                                                                           |
                     10:  +---------------------------------------------------------------------------*/
                     11: 
                     12: #include "fpu_system.h"
                     13: #include "exception.h"
                     14: #include "reg_constant.h"
                     15: #include "fpu_emu.h"
                     16: 
                     17: 
                     18: 
                     19: #define        HIPOWER 13
                     20: static unsigned short  lterms[HIPOWER][4] =
                     21:        {
                     22:        { 0x79b5, 0xd1cf, 0x17f7, 0xb172 },
                     23:        { 0x1b56, 0x058b, 0x7bff, 0x3d7f },
                     24:        { 0x8bb0, 0x8250, 0x846b, 0x0e35 },
                     25:        { 0xbc65, 0xf747, 0x556d, 0x0276 },
                     26:        { 0x17cb, 0x9e39, 0x61ff, 0x0057 },
                     27:        { 0xe018, 0x9776, 0x1848, 0x000a },
                     28:        { 0x66f2, 0xff30, 0xffe5, 0x0000 },
                     29:        { 0x682f, 0xffb6, 0x162b, 0x0000 },
                     30:        { 0xb7ca, 0x2956, 0x01b5, 0x0000 },
                     31:        { 0xcd3e, 0x4817, 0x001e, 0x0000 },
                     32:        { 0xb7e2, 0xecbe, 0x0001, 0x0000 },
                     33:        { 0x0ed5, 0x1a27, 0x0000, 0x0000 },
                     34:        { 0x101d, 0x0222, 0x0000, 0x0000 },
                     35:        };
                     36: 
                     37: 
                     38: /*--- poly_2xm1() -----------------------------------------------------------+
                     39:  |                                                                           |
                     40:  +---------------------------------------------------------------------------*/
                     41: int    poly_2xm1(FPU_REG *arg, FPU_REG *result)
                     42: {
                     43:   short                exponent;
                     44:   long long     Xll;
                     45:   FPU_REG           accum;
                     46: 
                     47: 
                     48:   exponent = arg->exp - EXP_BIAS;
                     49: 
                     50:   if ( arg->tag == TW_Zero )
                     51:     {
                     52:       /* Return 0.0 */
                     53:       reg_move(&CONST_Z, result);
                     54:       return 0;
                     55:     }
                     56: 
                     57:   if ( exponent >= 0 ) /* Can't hack a number >= 1.0 */
                     58:     {
                     59:       arith_invalid(result);
                     60:       return 1;
                     61:     }
                     62: 
                     63:   if ( arg->sign != SIGN_POS ) /* Can't hack a number < 0.0 */
                     64:     {
                     65:       arith_invalid(result);
                     66:       return 1;
                     67:     }
                     68:   
                     69:   if ( exponent < -64 )
                     70:     {
                     71:       reg_move(&CONST_LN2, result);
                     72:       return 0;
                     73:     }
                     74: 
                     75:   *(unsigned *)&Xll = arg->sigl;
                     76:   *(((unsigned *)&Xll)+1) = arg->sigh;
                     77:   if ( exponent < -1 )
                     78:     {
                     79:       /* shift the argument right by the required places */
                     80:       if ( shrx(&Xll, -1-exponent) >= 0x80000000U )
                     81:        Xll++;  /* round up */
                     82:     }
                     83: 
                     84:   *(short *)&(accum.sign) = 0; /* will be a valid positive nr with expon = 0 */
                     85:   accum.exp = 0;
                     86: 
                     87:   /* Do the basic fixed point polynomial evaluation */
                     88:   polynomial((unsigned *)&accum.sigl, (unsigned *)&Xll, lterms, HIPOWER-1);
                     89: 
                     90:   /* Convert to 64 bit signed-compatible */
                     91:   accum.exp += EXP_BIAS - 1;
                     92: 
                     93:   reg_move(&accum, result);
                     94: 
                     95:   normalize(result);
                     96: 
                     97:   return 0;
                     98: 
                     99: }

unix.superglobalmegacorp.com

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