xref: /illumos-gate/usr/src/uts/sparc/fpu/div.c (revision 7c478bd9)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright (c) 1988 by Sun Microsystems, Inc.
24*7c478bd9Sstevel@tonic-gate  */
25*7c478bd9Sstevel@tonic-gate 
26*7c478bd9Sstevel@tonic-gate #ident	"%Z%%M%	%I%	%E% SMI"	/* SunOS-4.1 1.9 88/11/30 */
27*7c478bd9Sstevel@tonic-gate 
28*7c478bd9Sstevel@tonic-gate #include <sys/fpu/fpu_simulator.h>
29*7c478bd9Sstevel@tonic-gate #include <sys/fpu/globals.h>
30*7c478bd9Sstevel@tonic-gate 
31*7c478bd9Sstevel@tonic-gate void
_fp_div(pfpsd,px,py,pz)32*7c478bd9Sstevel@tonic-gate _fp_div(pfpsd, px, py, pz)
33*7c478bd9Sstevel@tonic-gate 	fp_simd_type	*pfpsd;
34*7c478bd9Sstevel@tonic-gate 	unpacked	*px, *py, *pz;
35*7c478bd9Sstevel@tonic-gate {
36*7c478bd9Sstevel@tonic-gate 	unsigned	r[4], *y, q, c;
37*7c478bd9Sstevel@tonic-gate 	int		n;
38*7c478bd9Sstevel@tonic-gate 
39*7c478bd9Sstevel@tonic-gate 	*pz = *px;
40*7c478bd9Sstevel@tonic-gate 
41*7c478bd9Sstevel@tonic-gate 	if ((py->fpclass >= fp_quiet) || (px->fpclass >= fp_quiet)) {
42*7c478bd9Sstevel@tonic-gate 		if (py->fpclass >= px->fpclass) *pz = *py;
43*7c478bd9Sstevel@tonic-gate 		return;
44*7c478bd9Sstevel@tonic-gate 	}
45*7c478bd9Sstevel@tonic-gate 
46*7c478bd9Sstevel@tonic-gate 	pz->sign = px->sign ^ py->sign;
47*7c478bd9Sstevel@tonic-gate 	switch (px->fpclass) {
48*7c478bd9Sstevel@tonic-gate 	case fp_quiet:
49*7c478bd9Sstevel@tonic-gate 	case fp_signaling:
50*7c478bd9Sstevel@tonic-gate 		return;
51*7c478bd9Sstevel@tonic-gate 	case fp_zero:
52*7c478bd9Sstevel@tonic-gate 	case fp_infinity:
53*7c478bd9Sstevel@tonic-gate 		if (px->fpclass == py->fpclass) {	/* 0/0 or inf/inf */
54*7c478bd9Sstevel@tonic-gate 			fpu_error_nan(pfpsd, pz);
55*7c478bd9Sstevel@tonic-gate 			pz->fpclass = fp_quiet;
56*7c478bd9Sstevel@tonic-gate 		}
57*7c478bd9Sstevel@tonic-gate 		return;
58*7c478bd9Sstevel@tonic-gate 	case fp_normal:
59*7c478bd9Sstevel@tonic-gate 		switch (py->fpclass) {
60*7c478bd9Sstevel@tonic-gate 		case fp_zero:	/* number/0 */
61*7c478bd9Sstevel@tonic-gate 			fpu_set_exception(pfpsd, fp_division);
62*7c478bd9Sstevel@tonic-gate 			pz->fpclass = fp_infinity;
63*7c478bd9Sstevel@tonic-gate 			return;
64*7c478bd9Sstevel@tonic-gate 		case fp_infinity:	/* number/inf */
65*7c478bd9Sstevel@tonic-gate 			pz->fpclass = fp_zero;
66*7c478bd9Sstevel@tonic-gate 			return;
67*7c478bd9Sstevel@tonic-gate 		}
68*7c478bd9Sstevel@tonic-gate 	}
69*7c478bd9Sstevel@tonic-gate 
70*7c478bd9Sstevel@tonic-gate 	/* Now x and y are both normal or subnormal. */
71*7c478bd9Sstevel@tonic-gate 
72*7c478bd9Sstevel@tonic-gate 	r[0] = px->significand[0];
73*7c478bd9Sstevel@tonic-gate 	r[1] = px->significand[1];
74*7c478bd9Sstevel@tonic-gate 	r[2] = px->significand[2];
75*7c478bd9Sstevel@tonic-gate 	r[3] = px->significand[3];
76*7c478bd9Sstevel@tonic-gate 	y = py->significand;
77*7c478bd9Sstevel@tonic-gate 
78*7c478bd9Sstevel@tonic-gate 	if (fpu_cmpli(r, y, 4) >= 0)
79*7c478bd9Sstevel@tonic-gate 		pz->exponent = px->exponent - py->exponent;
80*7c478bd9Sstevel@tonic-gate 	else
81*7c478bd9Sstevel@tonic-gate 		pz->exponent = px->exponent - py->exponent - 1;
82*7c478bd9Sstevel@tonic-gate 
83*7c478bd9Sstevel@tonic-gate 	q = 0;
84*7c478bd9Sstevel@tonic-gate 	while (q < 0x10000) {	/* generate quo[0] */
85*7c478bd9Sstevel@tonic-gate 		q <<= 1;
86*7c478bd9Sstevel@tonic-gate 		if (fpu_cmpli(r, y, 4) >= 0) {
87*7c478bd9Sstevel@tonic-gate 			q += 1; 	/* if r>y do r-=y and q+=1 */
88*7c478bd9Sstevel@tonic-gate 			c = 0;
89*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[3], r[3], y[3], c);
90*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[2], r[2], y[2], c);
91*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[1], r[1], y[1], c);
92*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[0], r[0], y[0], c);
93*7c478bd9Sstevel@tonic-gate 		}
94*7c478bd9Sstevel@tonic-gate 		r[0] = (r[0]<<1)|((r[1]&0x80000000)>>31);	/* r << 1 */
95*7c478bd9Sstevel@tonic-gate 		r[1] = (r[1]<<1)|((r[2]&0x80000000)>>31);
96*7c478bd9Sstevel@tonic-gate 		r[2] = (r[2]<<1)|((r[3]&0x80000000)>>31);
97*7c478bd9Sstevel@tonic-gate 		r[3] = (r[3]<<1);
98*7c478bd9Sstevel@tonic-gate 	}
99*7c478bd9Sstevel@tonic-gate 	pz->significand[0] = q;
100*7c478bd9Sstevel@tonic-gate 	q = 0;			/* generate quo[1] */
101*7c478bd9Sstevel@tonic-gate 	n = 32;
102*7c478bd9Sstevel@tonic-gate 	while (n--) {
103*7c478bd9Sstevel@tonic-gate 		q <<= 1;
104*7c478bd9Sstevel@tonic-gate 		if (fpu_cmpli(r, y, 4) >= 0) {
105*7c478bd9Sstevel@tonic-gate 			q += 1; 	/* if r>y do r-=y and q+=1 */
106*7c478bd9Sstevel@tonic-gate 			c = 0;
107*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[3], r[3], y[3], c);
108*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[2], r[2], y[2], c);
109*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[1], r[1], y[1], c);
110*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[0], r[0], y[0], c);
111*7c478bd9Sstevel@tonic-gate 		}
112*7c478bd9Sstevel@tonic-gate 		r[0] = (r[0]<<1)|((r[1]&0x80000000)>>31);	/* r << 1 */
113*7c478bd9Sstevel@tonic-gate 		r[1] = (r[1]<<1)|((r[2]&0x80000000)>>31);
114*7c478bd9Sstevel@tonic-gate 		r[2] = (r[2]<<1)|((r[3]&0x80000000)>>31);
115*7c478bd9Sstevel@tonic-gate 		r[3] = (r[3]<<1);
116*7c478bd9Sstevel@tonic-gate 	}
117*7c478bd9Sstevel@tonic-gate 	pz->significand[1] = q;
118*7c478bd9Sstevel@tonic-gate 	q = 0;			/* generate quo[2] */
119*7c478bd9Sstevel@tonic-gate 	n = 32;
120*7c478bd9Sstevel@tonic-gate 	while (n--) {
121*7c478bd9Sstevel@tonic-gate 		q <<= 1;
122*7c478bd9Sstevel@tonic-gate 		if (fpu_cmpli(r, y, 4) >= 0) {
123*7c478bd9Sstevel@tonic-gate 			q += 1; 	/* if r>y do r-=y and q+=1 */
124*7c478bd9Sstevel@tonic-gate 			c = 0;
125*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[3], r[3], y[3], c);
126*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[2], r[2], y[2], c);
127*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[1], r[1], y[1], c);
128*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[0], r[0], y[0], c);
129*7c478bd9Sstevel@tonic-gate 		}
130*7c478bd9Sstevel@tonic-gate 		r[0] = (r[0]<<1)|((r[1]&0x80000000)>>31);	/* r << 1 */
131*7c478bd9Sstevel@tonic-gate 		r[1] = (r[1]<<1)|((r[2]&0x80000000)>>31);
132*7c478bd9Sstevel@tonic-gate 		r[2] = (r[2]<<1)|((r[3]&0x80000000)>>31);
133*7c478bd9Sstevel@tonic-gate 		r[3] = (r[3]<<1);
134*7c478bd9Sstevel@tonic-gate 	}
135*7c478bd9Sstevel@tonic-gate 	pz->significand[2] = q;
136*7c478bd9Sstevel@tonic-gate 	q = 0;			/* generate quo[3] */
137*7c478bd9Sstevel@tonic-gate 	n = 32;
138*7c478bd9Sstevel@tonic-gate 	while (n--) {
139*7c478bd9Sstevel@tonic-gate 		q <<= 1;
140*7c478bd9Sstevel@tonic-gate 		if (fpu_cmpli(r, y, 4) >= 0) {
141*7c478bd9Sstevel@tonic-gate 			q += 1; 	/* if r>y do r-=y and q+=1 */
142*7c478bd9Sstevel@tonic-gate 			c  = 0;
143*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[3], r[3], y[3], c);
144*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[2], r[2], y[2], c);
145*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[1], r[1], y[1], c);
146*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&r[0], r[0], y[0], c);
147*7c478bd9Sstevel@tonic-gate 		}
148*7c478bd9Sstevel@tonic-gate 		r[0] = (r[0]<<1)|((r[1]&0x80000000)>>31);	/* r << 1 */
149*7c478bd9Sstevel@tonic-gate 		r[1] = (r[1]<<1)|((r[2]&0x80000000)>>31);
150*7c478bd9Sstevel@tonic-gate 		r[2] = (r[2]<<1)|((r[3]&0x80000000)>>31);
151*7c478bd9Sstevel@tonic-gate 		r[3] = (r[3]<<1);
152*7c478bd9Sstevel@tonic-gate 	}
153*7c478bd9Sstevel@tonic-gate 	pz->significand[3] = q;
154*7c478bd9Sstevel@tonic-gate 	if ((r[0]|r[1]|r[2]|r[3]) == 0) pz->sticky = pz->rounded = 0;
155*7c478bd9Sstevel@tonic-gate 	else {
156*7c478bd9Sstevel@tonic-gate 		pz->sticky = 1;		/* half way case won't occur */
157*7c478bd9Sstevel@tonic-gate 		if (fpu_cmpli(r, y, 4) >= 0) pz->rounded = 1;
158*7c478bd9Sstevel@tonic-gate 	}
159*7c478bd9Sstevel@tonic-gate }
160*7c478bd9Sstevel@tonic-gate 
161*7c478bd9Sstevel@tonic-gate void
_fp_sqrt(pfpsd,px,pz)162*7c478bd9Sstevel@tonic-gate _fp_sqrt(pfpsd, px, pz)
163*7c478bd9Sstevel@tonic-gate 	fp_simd_type	*pfpsd;
164*7c478bd9Sstevel@tonic-gate 	unpacked	*px, *pz;
165*7c478bd9Sstevel@tonic-gate {				/* *pz gets sqrt(*px) */
166*7c478bd9Sstevel@tonic-gate 
167*7c478bd9Sstevel@tonic-gate 	unsigned *x, r, c, q, t[4], s[4];
168*7c478bd9Sstevel@tonic-gate 	*pz = *px;
169*7c478bd9Sstevel@tonic-gate 	switch (px->fpclass) {
170*7c478bd9Sstevel@tonic-gate 	case fp_quiet:
171*7c478bd9Sstevel@tonic-gate 	case fp_signaling:
172*7c478bd9Sstevel@tonic-gate 	case fp_zero:
173*7c478bd9Sstevel@tonic-gate 		return;
174*7c478bd9Sstevel@tonic-gate 	case fp_infinity:
175*7c478bd9Sstevel@tonic-gate 		if (px->sign == 1) {	/* sqrt(-inf) */
176*7c478bd9Sstevel@tonic-gate 			fpu_error_nan(pfpsd, pz);
177*7c478bd9Sstevel@tonic-gate 			pz->fpclass = fp_quiet;
178*7c478bd9Sstevel@tonic-gate 		}
179*7c478bd9Sstevel@tonic-gate 		return;
180*7c478bd9Sstevel@tonic-gate 	case fp_normal:
181*7c478bd9Sstevel@tonic-gate 		if (px->sign == 1) {	/* sqrt(-norm) */
182*7c478bd9Sstevel@tonic-gate 			fpu_error_nan(pfpsd, pz);
183*7c478bd9Sstevel@tonic-gate 			pz->fpclass = fp_quiet;
184*7c478bd9Sstevel@tonic-gate 			return;
185*7c478bd9Sstevel@tonic-gate 		}
186*7c478bd9Sstevel@tonic-gate 	}
187*7c478bd9Sstevel@tonic-gate 
188*7c478bd9Sstevel@tonic-gate 	/* Now x is normal. */
189*7c478bd9Sstevel@tonic-gate 	x = px->significand;
190*7c478bd9Sstevel@tonic-gate 	if (px->exponent & 1) {
191*7c478bd9Sstevel@tonic-gate 				/*
192*7c478bd9Sstevel@tonic-gate 				 * sqrt(1.f * 2**odd) = sqrt (2.+2f)
193*7c478bd9Sstevel@tonic-gate 				 * 2**(odd-1)/2
194*7c478bd9Sstevel@tonic-gate 				 */
195*7c478bd9Sstevel@tonic-gate 		pz->exponent = (px->exponent - 1) / 2;
196*7c478bd9Sstevel@tonic-gate 		x[0] = (x[0]<<1)|((x[1]&0x80000000)>>31);	/* x<<1 */
197*7c478bd9Sstevel@tonic-gate 		x[1] = (x[1]<<1)|((x[2]&0x80000000)>>31);
198*7c478bd9Sstevel@tonic-gate 		x[2] = (x[2]<<1)|((x[3]&0x80000000)>>31);
199*7c478bd9Sstevel@tonic-gate 		x[3] = (x[3]<<1);
200*7c478bd9Sstevel@tonic-gate 	} else {
201*7c478bd9Sstevel@tonic-gate 				/*
202*7c478bd9Sstevel@tonic-gate 				 * sqrt(1.f * 2**even) = sqrt (1.f)
203*7c478bd9Sstevel@tonic-gate 				 * 2**(even)/2
204*7c478bd9Sstevel@tonic-gate 				 */
205*7c478bd9Sstevel@tonic-gate 		pz->exponent = px->exponent / 2;
206*7c478bd9Sstevel@tonic-gate 	}
207*7c478bd9Sstevel@tonic-gate 	s[0] = s[1] = s[2] = s[3] = t[0] = t[1] = t[2] = t[3] = 0;
208*7c478bd9Sstevel@tonic-gate 	q = 0;
209*7c478bd9Sstevel@tonic-gate 	r = 0x00010000;
210*7c478bd9Sstevel@tonic-gate 	while (r != 0) {				/* compute sqrt[0] */
211*7c478bd9Sstevel@tonic-gate 		t[0] = s[0] + r;
212*7c478bd9Sstevel@tonic-gate 		if (t[0] <= x[0]) {
213*7c478bd9Sstevel@tonic-gate 			s[0] = t[0] + r;
214*7c478bd9Sstevel@tonic-gate 			x[0] -= t[0];
215*7c478bd9Sstevel@tonic-gate 			q += r;
216*7c478bd9Sstevel@tonic-gate 		}
217*7c478bd9Sstevel@tonic-gate 		x[0] = (x[0]<<1)|((x[1]&0x80000000)>>31);	/* x<<1 */
218*7c478bd9Sstevel@tonic-gate 		x[1] = (x[1]<<1)|((x[2]&0x80000000)>>31);
219*7c478bd9Sstevel@tonic-gate 		x[2] = (x[2]<<1)|((x[3]&0x80000000)>>31);
220*7c478bd9Sstevel@tonic-gate 		x[3] = (x[3]<<1);
221*7c478bd9Sstevel@tonic-gate 		r >>= 1;
222*7c478bd9Sstevel@tonic-gate 	}
223*7c478bd9Sstevel@tonic-gate 	pz->significand[0] = q;
224*7c478bd9Sstevel@tonic-gate 	q = 0;
225*7c478bd9Sstevel@tonic-gate 	r = (unsigned)0x80000000;
226*7c478bd9Sstevel@tonic-gate 	while (r != 0) {				/* compute sqrt[1] */
227*7c478bd9Sstevel@tonic-gate 		t[1] = s[1] + r;			/* no carry */
228*7c478bd9Sstevel@tonic-gate 		t[0] = s[0];
229*7c478bd9Sstevel@tonic-gate 		if (fpu_cmpli(t, x, 2) <= 0) {
230*7c478bd9Sstevel@tonic-gate 			c = 0;
231*7c478bd9Sstevel@tonic-gate 			c = fpu_add3wc(&s[1], t[1], r, c);
232*7c478bd9Sstevel@tonic-gate 			c = fpu_add3wc(&s[0], t[0], 0, c);
233*7c478bd9Sstevel@tonic-gate 			c = 0;
234*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&x[1], x[1], t[1], c);
235*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&x[0], x[0], t[0], c);
236*7c478bd9Sstevel@tonic-gate 			q += r;
237*7c478bd9Sstevel@tonic-gate 		}
238*7c478bd9Sstevel@tonic-gate 		x[0] = (x[0]<<1)|((x[1]&0x80000000)>>31);	/* x<<1 */
239*7c478bd9Sstevel@tonic-gate 		x[1] = (x[1]<<1)|((x[2]&0x80000000)>>31);
240*7c478bd9Sstevel@tonic-gate 		x[2] = (x[2]<<1)|((x[3]&0x80000000)>>31);
241*7c478bd9Sstevel@tonic-gate 		x[3] = (x[3]<<1);
242*7c478bd9Sstevel@tonic-gate 		r >>= 1;
243*7c478bd9Sstevel@tonic-gate 	}
244*7c478bd9Sstevel@tonic-gate 	pz->significand[1] = q;
245*7c478bd9Sstevel@tonic-gate 	q = 0;
246*7c478bd9Sstevel@tonic-gate 	r = (unsigned)0x80000000;
247*7c478bd9Sstevel@tonic-gate 	while (r != 0) {				/* compute sqrt[2] */
248*7c478bd9Sstevel@tonic-gate 		t[2] = s[2] + r;			/* no carry */
249*7c478bd9Sstevel@tonic-gate 		t[1] = s[1];
250*7c478bd9Sstevel@tonic-gate 		t[0] = s[0];
251*7c478bd9Sstevel@tonic-gate 		if (fpu_cmpli(t, x, 3) <= 0) {
252*7c478bd9Sstevel@tonic-gate 			c = 0;
253*7c478bd9Sstevel@tonic-gate 			c = fpu_add3wc(&s[2], t[2], r, c);
254*7c478bd9Sstevel@tonic-gate 			c = fpu_add3wc(&s[1], t[1], 0, c);
255*7c478bd9Sstevel@tonic-gate 			c = fpu_add3wc(&s[0], t[0], 0, c);
256*7c478bd9Sstevel@tonic-gate 			c = 0;
257*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&x[2], x[2], t[2], c);
258*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&x[1], x[1], t[1], c);
259*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&x[0], x[0], t[0], c);
260*7c478bd9Sstevel@tonic-gate 			q += r;
261*7c478bd9Sstevel@tonic-gate 		}
262*7c478bd9Sstevel@tonic-gate 		x[0] = (x[0]<<1)|((x[1]&0x80000000)>>31);	/* x<<1 */
263*7c478bd9Sstevel@tonic-gate 		x[1] = (x[1]<<1)|((x[2]&0x80000000)>>31);
264*7c478bd9Sstevel@tonic-gate 		x[2] = (x[2]<<1)|((x[3]&0x80000000)>>31);
265*7c478bd9Sstevel@tonic-gate 		x[3] = (x[3]<<1);
266*7c478bd9Sstevel@tonic-gate 		r >>= 1;
267*7c478bd9Sstevel@tonic-gate 	}
268*7c478bd9Sstevel@tonic-gate 	pz->significand[2] = q;
269*7c478bd9Sstevel@tonic-gate 	q = 0;
270*7c478bd9Sstevel@tonic-gate 	r = (unsigned)0x80000000;
271*7c478bd9Sstevel@tonic-gate 	while (r != 0) {				/* compute sqrt[3] */
272*7c478bd9Sstevel@tonic-gate 		t[3] = s[3] + r;				/* no carry */
273*7c478bd9Sstevel@tonic-gate 		t[2] = s[2];
274*7c478bd9Sstevel@tonic-gate 		t[1] = s[1];
275*7c478bd9Sstevel@tonic-gate 		t[0] = s[0];
276*7c478bd9Sstevel@tonic-gate 		if (fpu_cmpli(t, x, 4) <= 0) {
277*7c478bd9Sstevel@tonic-gate 			c = 0;
278*7c478bd9Sstevel@tonic-gate 			c = fpu_add3wc(&s[3], t[3], r, c);
279*7c478bd9Sstevel@tonic-gate 			c = fpu_add3wc(&s[2], t[2], 0, c);
280*7c478bd9Sstevel@tonic-gate 			c = fpu_add3wc(&s[1], t[1], 0, c);
281*7c478bd9Sstevel@tonic-gate 			c = fpu_add3wc(&s[0], t[0], 0, c);
282*7c478bd9Sstevel@tonic-gate 			c = 0;
283*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&x[3], x[3], t[3], c);
284*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&x[2], x[2], t[2], c);
285*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&x[1], x[1], t[1], c);
286*7c478bd9Sstevel@tonic-gate 			c = fpu_sub3wc(&x[0], x[0], t[0], c);
287*7c478bd9Sstevel@tonic-gate 			q += r;
288*7c478bd9Sstevel@tonic-gate 		}
289*7c478bd9Sstevel@tonic-gate 		x[0] = (x[0]<<1)|((x[1]&0x80000000)>>31);	/* x<<1 */
290*7c478bd9Sstevel@tonic-gate 		x[1] = (x[1]<<1)|((x[2]&0x80000000)>>31);
291*7c478bd9Sstevel@tonic-gate 		x[2] = (x[2]<<1)|((x[3]&0x80000000)>>31);
292*7c478bd9Sstevel@tonic-gate 		x[3] = (x[3]<<1);
293*7c478bd9Sstevel@tonic-gate 		r >>= 1;
294*7c478bd9Sstevel@tonic-gate 	}
295*7c478bd9Sstevel@tonic-gate 	pz->significand[3] = q;
296*7c478bd9Sstevel@tonic-gate 	if ((x[0]|x[1]|x[2]|x[3]) == 0) {
297*7c478bd9Sstevel@tonic-gate 		pz->sticky = pz->rounded = 0;
298*7c478bd9Sstevel@tonic-gate 	} else {
299*7c478bd9Sstevel@tonic-gate 		pz->sticky = 1;
300*7c478bd9Sstevel@tonic-gate 		if (fpu_cmpli(s, x, 4) < 0)
301*7c478bd9Sstevel@tonic-gate 			pz->rounded = 1;
302*7c478bd9Sstevel@tonic-gate 		else
303*7c478bd9Sstevel@tonic-gate 			pz->rounded = 0;
304*7c478bd9Sstevel@tonic-gate 	}
305*7c478bd9Sstevel@tonic-gate }
306