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