root/drivers/FPU-emu/poly_2xm1.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. poly_2xm1

   1 /*---------------------------------------------------------------------------+
   2  |  poly_2xm1.c                                                              |
   3  |                                                                           |
   4  | Function to compute 2^x-1 by a polynomial approximation.                  |
   5  |                                                                           |
   6  | Copyright (C) 1992,1993                                                   |
   7  |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
   8  |                       Australia.  E-mail   billm@vaxc.cc.monash.edu.au    |
   9  |                                                                           |
  10  |                                                                           |
  11  +---------------------------------------------------------------------------*/
  12 
  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 const     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  | Requires a positive argument which is TW_Valid and < 1.                   |
  40  +---------------------------------------------------------------------------*/
  41 int     poly_2xm1(FPU_REG const *arg, FPU_REG *result)
     /* [previous][next][first][last][top][bottom][index][help] */
  42 {
  43   short         exponent;
  44   long long     Xll;
  45   FPU_REG       accum;
  46 
  47 
  48   exponent = arg->exp - EXP_BIAS;
  49 
  50 #ifdef PARANOID
  51   if ( (arg->sign != SIGN_POS)  /* Can't hack a number < 0.0 */
  52       || (exponent >= 0)        /* or a |number| >= 1.0 */
  53       || (arg->tag != TW_Valid) )
  54     {
  55       /* Number negative, too large, or not Valid. */
  56       EXCEPTION(EX_INTERNAL|0x127);
  57       return 1;
  58     }
  59 #endif PARANOID
  60 
  61   *(unsigned *)&Xll = arg->sigl;
  62   *(((unsigned *)&Xll)+1) = arg->sigh;
  63   if ( exponent < -1 )
  64     {
  65       /* Shift the argument right by the required places. */
  66       if ( shrx(&Xll, -1-exponent) >= 0x80000000U )
  67         Xll++;  /* round up */
  68     }
  69 
  70   *(short *)&(accum.sign) = 0; /* Will be a valid positive nr with expon = 0 */
  71   accum.exp = 0;
  72 
  73   /* Do the basic fixed point polynomial evaluation */
  74   polynomial((unsigned *)&accum.sigl, (unsigned *)&Xll, lterms, HIPOWER-1);
  75 
  76   /* Convert to 64 bit signed-compatible */
  77   accum.exp += EXP_BIAS - 1;
  78 
  79   reg_move(&accum, result);
  80 
  81   normalize(result);
  82 
  83   return 0;
  84 
  85 }

/* [previous][next][first][last][top][bottom][index][help] */