Print this page




  67 #define twom28  C[5].d
  68 #define twom76  C[6].d
  69 #define twom124 C[7].d
  70 #define two36   C[8].d
  71 #define twom32  C[9].d
  72 #define huge    C[10].d
  73 #define tiny    C[11].d
  74 #define tiny2   C[12].d
  75 #define zero    C[13].d
  76 #define inf     C[14].d
  77 #define snan    C[15].d
  78 
  79 static const unsigned int fsr_rm = 0xc0000000u;
  80 
  81 /*
  82  * fmal for SPARC: 128-bit quad precision, big-endian
  83  */
  84 long double
  85 __fmal(long double x, long double y, long double z) {
  86         union {
  87                 unsigned i[4];
  88                 long double q;
  89         } xx, yy, zz;
  90         union {
  91                 unsigned i[2];
  92                 double d;
  93         } u;
  94         double dx[5], dy[5], dxy[9], c, s;
  95         unsigned xy0, xy1, xy2, xy3, xy4, xy5, xy6, xy7;
  96         unsigned z0, z1, z2, z3, z4, z5, z6, z7;
  97         unsigned rm, sticky;
  98         unsigned int fsr;
  99         int hx, hy, hz, ex, ey, ez, exy, sxy, sz, e, ibit;
 100         int cx, cy, cz;
 101         volatile double dummy;
 102 
 103         /* extract the high order words of the arguments */
 104         xx.q = x;
 105         yy.q = y;
 106         zz.q = z;
 107         hx = xx.i[0] & ~0x80000000;
 108         hy = yy.i[0] & ~0x80000000;
 109         hz = zz.i[0] & ~0x80000000;
 110 
 111         /*
 112          * distinguish zero, finite nonzero, infinite, and quiet nan
 113          * arguments; raise invalid and return for signaling nans
 114          */
 115         if (hx >= 0x7fff0000) {
 116                 if ((hx & 0xffff) | xx.i[1] | xx.i[2] | xx.i[3]) {
 117                         if (!(hx & 0x8000)) {




  67 #define twom28  C[5].d
  68 #define twom76  C[6].d
  69 #define twom124 C[7].d
  70 #define two36   C[8].d
  71 #define twom32  C[9].d
  72 #define huge    C[10].d
  73 #define tiny    C[11].d
  74 #define tiny2   C[12].d
  75 #define zero    C[13].d
  76 #define inf     C[14].d
  77 #define snan    C[15].d
  78 
  79 static const unsigned int fsr_rm = 0xc0000000u;
  80 
  81 /*
  82  * fmal for SPARC: 128-bit quad precision, big-endian
  83  */
  84 long double
  85 __fmal(long double x, long double y, long double z) {
  86         union {
  87                 unsigned int i[4];
  88                 long double q;
  89         } xx, yy, zz;
  90         union {
  91                 unsigned int i[2];
  92                 double d;
  93         } u;
  94         double dx[5], dy[5], dxy[9], c, s;
  95         unsigned int xy0, xy1, xy2, xy3, xy4, xy5, xy6, xy7;
  96         unsigned int z0, z1, z2, z3, z4, z5, z6, z7;
  97         unsigned int rm, sticky;
  98         unsigned int fsr;
  99         int hx, hy, hz, ex, ey, ez, exy, sxy, sz, e, ibit;
 100         int cx, cy, cz;
 101         volatile double dummy;
 102 
 103         /* extract the high order words of the arguments */
 104         xx.q = x;
 105         yy.q = y;
 106         zz.q = z;
 107         hx = xx.i[0] & ~0x80000000;
 108         hy = yy.i[0] & ~0x80000000;
 109         hz = zz.i[0] & ~0x80000000;
 110 
 111         /*
 112          * distinguish zero, finite nonzero, infinite, and quiet nan
 113          * arguments; raise invalid and return for signaling nans
 114          */
 115         if (hx >= 0x7fff0000) {
 116                 if ((hx & 0xffff) | xx.i[1] | xx.i[2] | xx.i[3]) {
 117                         if (!(hx & 0x8000)) {