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)) { |