1*25c28e83SPiotr Jasiukajtis /*
2*25c28e83SPiotr Jasiukajtis  * CDDL HEADER START
3*25c28e83SPiotr Jasiukajtis  *
4*25c28e83SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
5*25c28e83SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
6*25c28e83SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
7*25c28e83SPiotr Jasiukajtis  *
8*25c28e83SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*25c28e83SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
10*25c28e83SPiotr Jasiukajtis  * See the License for the specific language governing permissions
11*25c28e83SPiotr Jasiukajtis  * and limitations under the License.
12*25c28e83SPiotr Jasiukajtis  *
13*25c28e83SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
14*25c28e83SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*25c28e83SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
16*25c28e83SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
17*25c28e83SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
18*25c28e83SPiotr Jasiukajtis  *
19*25c28e83SPiotr Jasiukajtis  * CDDL HEADER END
20*25c28e83SPiotr Jasiukajtis  */
21*25c28e83SPiotr Jasiukajtis 
22*25c28e83SPiotr Jasiukajtis /*
23*25c28e83SPiotr Jasiukajtis  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24*25c28e83SPiotr Jasiukajtis  * Use is subject to license terms.
25*25c28e83SPiotr Jasiukajtis  */
26*25c28e83SPiotr Jasiukajtis 
27*25c28e83SPiotr Jasiukajtis /*
28*25c28e83SPiotr Jasiukajtis  * Copyright 2011, Richard Lowe
29*25c28e83SPiotr Jasiukajtis  */
30*25c28e83SPiotr Jasiukajtis 
31*25c28e83SPiotr Jasiukajtis /* Functions in this file are duplicated in locallibm.il.  Keep them in sync */
32*25c28e83SPiotr Jasiukajtis 
33*25c28e83SPiotr Jasiukajtis #ifndef _LIBM_INLINES_H
34*25c28e83SPiotr Jasiukajtis #define	_LIBM_INLINES_H
35*25c28e83SPiotr Jasiukajtis 
36*25c28e83SPiotr Jasiukajtis #ifdef __GNUC__
37*25c28e83SPiotr Jasiukajtis 
38*25c28e83SPiotr Jasiukajtis #ifdef __cplusplus
39*25c28e83SPiotr Jasiukajtis extern "C" {
40*25c28e83SPiotr Jasiukajtis #endif
41*25c28e83SPiotr Jasiukajtis 
42*25c28e83SPiotr Jasiukajtis #include <sys/types.h>
43*25c28e83SPiotr Jasiukajtis #include <sys/ieeefp.h>
44*25c28e83SPiotr Jasiukajtis 
45*25c28e83SPiotr Jasiukajtis #define	_LO_WORD(x)	((uint32_t *)&x)[0]
46*25c28e83SPiotr Jasiukajtis #define	_HI_WORD(x)	((uint32_t *)&x)[1]
47*25c28e83SPiotr Jasiukajtis #define	_HIER_WORD(x)	((uint32_t *)&x)[2]
48*25c28e83SPiotr Jasiukajtis 
49*25c28e83SPiotr Jasiukajtis extern __inline__ double
50*25c28e83SPiotr Jasiukajtis __inline_sqrt(double a)
51*25c28e83SPiotr Jasiukajtis {
52*25c28e83SPiotr Jasiukajtis 	double ret;
53*25c28e83SPiotr Jasiukajtis 
54*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fsqrt\n\t" : "=t" (ret) : "0" (a) : "cc");
55*25c28e83SPiotr Jasiukajtis 	return (ret);
56*25c28e83SPiotr Jasiukajtis }
57*25c28e83SPiotr Jasiukajtis 
58*25c28e83SPiotr Jasiukajtis extern __inline__ double
59*25c28e83SPiotr Jasiukajtis __ieee754_sqrt(double a)
60*25c28e83SPiotr Jasiukajtis {
61*25c28e83SPiotr Jasiukajtis 	return (__inline_sqrt(a));
62*25c28e83SPiotr Jasiukajtis }
63*25c28e83SPiotr Jasiukajtis 
64*25c28e83SPiotr Jasiukajtis extern __inline__ float
65*25c28e83SPiotr Jasiukajtis __inline_sqrtf(float a)
66*25c28e83SPiotr Jasiukajtis {
67*25c28e83SPiotr Jasiukajtis 	float ret;
68*25c28e83SPiotr Jasiukajtis 
69*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fsqrt\n\t" : "=t" (ret) : "0" (a) : "cc");
70*25c28e83SPiotr Jasiukajtis 	return (ret);
71*25c28e83SPiotr Jasiukajtis }
72*25c28e83SPiotr Jasiukajtis 
73*25c28e83SPiotr Jasiukajtis extern __inline__ double
74*25c28e83SPiotr Jasiukajtis __inline_rint(double a)
75*25c28e83SPiotr Jasiukajtis {
76*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
77*25c28e83SPiotr Jasiukajtis 	    "andl $0x7fffffff,%1\n\t"
78*25c28e83SPiotr Jasiukajtis 	    "cmpl $0x43300000,%1\n\t"
79*25c28e83SPiotr Jasiukajtis 	    "jae  1f\n\t"
80*25c28e83SPiotr Jasiukajtis 	    "frndint\n\t"
81*25c28e83SPiotr Jasiukajtis 	    "1: fwait\n\t"
82*25c28e83SPiotr Jasiukajtis 	    : "+t" (a), "+&r" (_HI_WORD(a))
83*25c28e83SPiotr Jasiukajtis 	    :
84*25c28e83SPiotr Jasiukajtis 	    : "cc");
85*25c28e83SPiotr Jasiukajtis 
86*25c28e83SPiotr Jasiukajtis 	return (a);
87*25c28e83SPiotr Jasiukajtis }
88*25c28e83SPiotr Jasiukajtis 
89*25c28e83SPiotr Jasiukajtis /*
90*25c28e83SPiotr Jasiukajtis  * 00 - 24 bits
91*25c28e83SPiotr Jasiukajtis  * 01 - reserved
92*25c28e83SPiotr Jasiukajtis  * 10 - 53 bits
93*25c28e83SPiotr Jasiukajtis  * 11 - 64 bits
94*25c28e83SPiotr Jasiukajtis  */
95*25c28e83SPiotr Jasiukajtis extern __inline__ int
96*25c28e83SPiotr Jasiukajtis __swapRP(int i)
97*25c28e83SPiotr Jasiukajtis {
98*25c28e83SPiotr Jasiukajtis 	int ret;
99*25c28e83SPiotr Jasiukajtis 	uint16_t cw;
100*25c28e83SPiotr Jasiukajtis 
101*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fstcw %0\n\t" : "=m" (cw));
102*25c28e83SPiotr Jasiukajtis 
103*25c28e83SPiotr Jasiukajtis 	ret = (cw >> 8) & 0x3;
104*25c28e83SPiotr Jasiukajtis 	cw = (cw & 0xfcff) | ((i & 0x3) << 8);
105*25c28e83SPiotr Jasiukajtis 
106*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fldcw %0\n\t" : : "m" (cw));
107*25c28e83SPiotr Jasiukajtis 
108*25c28e83SPiotr Jasiukajtis 	return (ret);
109*25c28e83SPiotr Jasiukajtis }
110*25c28e83SPiotr Jasiukajtis 
111*25c28e83SPiotr Jasiukajtis /*
112*25c28e83SPiotr Jasiukajtis  * 00 - Round to nearest, with even preferred
113*25c28e83SPiotr Jasiukajtis  * 01 - Round down
114*25c28e83SPiotr Jasiukajtis  * 10 - Round up
115*25c28e83SPiotr Jasiukajtis  * 11 - Chop
116*25c28e83SPiotr Jasiukajtis  */
117*25c28e83SPiotr Jasiukajtis extern __inline__ enum fp_direction_type
118*25c28e83SPiotr Jasiukajtis __swap87RD(enum fp_direction_type i)
119*25c28e83SPiotr Jasiukajtis {
120*25c28e83SPiotr Jasiukajtis 	int ret;
121*25c28e83SPiotr Jasiukajtis 	uint16_t cw;
122*25c28e83SPiotr Jasiukajtis 
123*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fstcw %0\n\t" : "=m" (cw));
124*25c28e83SPiotr Jasiukajtis 
125*25c28e83SPiotr Jasiukajtis 	ret = (cw >> 10) & 0x3;
126*25c28e83SPiotr Jasiukajtis 	cw = (cw & 0xf3ff) | ((i & 0x3) << 10);
127*25c28e83SPiotr Jasiukajtis 
128*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fldcw %0\n\t" : : "m" (cw));
129*25c28e83SPiotr Jasiukajtis 
130*25c28e83SPiotr Jasiukajtis 	return (ret);
131*25c28e83SPiotr Jasiukajtis }
132*25c28e83SPiotr Jasiukajtis 
133*25c28e83SPiotr Jasiukajtis extern __inline__ double
134*25c28e83SPiotr Jasiukajtis ceil(double d)
135*25c28e83SPiotr Jasiukajtis {
136*25c28e83SPiotr Jasiukajtis 	/*
137*25c28e83SPiotr Jasiukajtis 	 * Let's set a Rounding Control (RC) bits from x87 FPU Control Word
138*25c28e83SPiotr Jasiukajtis 	 * to fp_positive and save old bits in rd.
139*25c28e83SPiotr Jasiukajtis 	 */
140*25c28e83SPiotr Jasiukajtis 	short rd = __swap87RD(fp_positive);
141*25c28e83SPiotr Jasiukajtis 
142*25c28e83SPiotr Jasiukajtis 	/*
143*25c28e83SPiotr Jasiukajtis 	 * The FRNDINT instruction returns a floating-point value that is the
144*25c28e83SPiotr Jasiukajtis 	 * integral value closest to the source value in the direction of the
145*25c28e83SPiotr Jasiukajtis 	 * rounding mode specified in the RC field of the x87 FPU control word.
146*25c28e83SPiotr Jasiukajtis 	 *
147*25c28e83SPiotr Jasiukajtis 	 * Rounds the source value in the ST(0) register to the nearest
148*25c28e83SPiotr Jasiukajtis 	 * integral value, depending on the current rounding mode
149*25c28e83SPiotr Jasiukajtis 	 * (setting of the RC field of the FPU control word),
150*25c28e83SPiotr Jasiukajtis 	 * and stores the result in ST(0).
151*25c28e83SPiotr Jasiukajtis 	 */
152*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("frndint" : "+t" (d) : : "cc");
153*25c28e83SPiotr Jasiukajtis 
154*25c28e83SPiotr Jasiukajtis 	/* restore old RC bits */
155*25c28e83SPiotr Jasiukajtis 	__swap87RD(rd);
156*25c28e83SPiotr Jasiukajtis 
157*25c28e83SPiotr Jasiukajtis 	return (d);
158*25c28e83SPiotr Jasiukajtis }
159*25c28e83SPiotr Jasiukajtis 
160*25c28e83SPiotr Jasiukajtis extern __inline__ double
161*25c28e83SPiotr Jasiukajtis copysign(double d1, double d2)
162*25c28e83SPiotr Jasiukajtis {
163*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
164*25c28e83SPiotr Jasiukajtis 	    "andl $0x7fffffff,%0\n\t"	/* %0 <-- hi_32(abs(d)) */
165*25c28e83SPiotr Jasiukajtis 	    "andl $0x80000000,%1\n\t"	/* %1[31] <-- sign_bit(d2) */
166*25c28e83SPiotr Jasiukajtis 	    "orl  %1,%0\n\t"		/* %0 <-- hi_32(copysign(x,y)) */
167*25c28e83SPiotr Jasiukajtis 	    : "+&r" (_HI_WORD(d1)), "+r" (_HI_WORD(d2))
168*25c28e83SPiotr Jasiukajtis 	    :
169*25c28e83SPiotr Jasiukajtis 	    : "cc");
170*25c28e83SPiotr Jasiukajtis 
171*25c28e83SPiotr Jasiukajtis 	return (d1);
172*25c28e83SPiotr Jasiukajtis }
173*25c28e83SPiotr Jasiukajtis 
174*25c28e83SPiotr Jasiukajtis extern __inline__ double
175*25c28e83SPiotr Jasiukajtis fabs(double d)
176*25c28e83SPiotr Jasiukajtis {
177*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fabs\n\t" : "+t" (d) : : "cc");
178*25c28e83SPiotr Jasiukajtis 	return (d);
179*25c28e83SPiotr Jasiukajtis }
180*25c28e83SPiotr Jasiukajtis 
181*25c28e83SPiotr Jasiukajtis extern __inline__ float
182*25c28e83SPiotr Jasiukajtis fabsf(float d)
183*25c28e83SPiotr Jasiukajtis {
184*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fabs\n\t" : "+t" (d) : : "cc");
185*25c28e83SPiotr Jasiukajtis 	return (d);
186*25c28e83SPiotr Jasiukajtis }
187*25c28e83SPiotr Jasiukajtis 
188*25c28e83SPiotr Jasiukajtis extern __inline__ long double
189*25c28e83SPiotr Jasiukajtis fabsl(long double d)
190*25c28e83SPiotr Jasiukajtis {
191*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fabs\n\t" : "+t" (d) : : "cc");
192*25c28e83SPiotr Jasiukajtis 	return (d);
193*25c28e83SPiotr Jasiukajtis }
194*25c28e83SPiotr Jasiukajtis 
195*25c28e83SPiotr Jasiukajtis extern __inline__ int
196*25c28e83SPiotr Jasiukajtis finite(double d)
197*25c28e83SPiotr Jasiukajtis {
198*25c28e83SPiotr Jasiukajtis 	int ret = _HI_WORD(d);
199*25c28e83SPiotr Jasiukajtis 
200*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
201*25c28e83SPiotr Jasiukajtis 	    "notl %0\n\t"
202*25c28e83SPiotr Jasiukajtis 	    "andl $0x7ff00000,%0\n\t"
203*25c28e83SPiotr Jasiukajtis 	    "negl %0\n\t"
204*25c28e83SPiotr Jasiukajtis 	    "shrl $31,%0\n\t"
205*25c28e83SPiotr Jasiukajtis 	    : "+r" (ret)
206*25c28e83SPiotr Jasiukajtis 	    :
207*25c28e83SPiotr Jasiukajtis 	    : "cc");
208*25c28e83SPiotr Jasiukajtis 	return (ret);
209*25c28e83SPiotr Jasiukajtis }
210*25c28e83SPiotr Jasiukajtis 
211*25c28e83SPiotr Jasiukajtis extern __inline__ double
212*25c28e83SPiotr Jasiukajtis floor(double d)
213*25c28e83SPiotr Jasiukajtis {
214*25c28e83SPiotr Jasiukajtis 	short rd = __swap87RD(fp_negative);
215*25c28e83SPiotr Jasiukajtis 
216*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("frndint" : "+t" (d), "+r" (rd) : : "cc");
217*25c28e83SPiotr Jasiukajtis 	__swap87RD(rd);
218*25c28e83SPiotr Jasiukajtis 
219*25c28e83SPiotr Jasiukajtis 	return (d);
220*25c28e83SPiotr Jasiukajtis }
221*25c28e83SPiotr Jasiukajtis 
222*25c28e83SPiotr Jasiukajtis /*
223*25c28e83SPiotr Jasiukajtis  *      branchless __isnan
224*25c28e83SPiotr Jasiukajtis  *      ((0x7ff00000-[((lx|-lx)>>31)&1]|ahx)>>31)&1 = 1 iff x is NaN
225*25c28e83SPiotr Jasiukajtis  */
226*25c28e83SPiotr Jasiukajtis extern __inline__ int
227*25c28e83SPiotr Jasiukajtis isnan(double d)
228*25c28e83SPiotr Jasiukajtis {
229*25c28e83SPiotr Jasiukajtis 	int ret;
230*25c28e83SPiotr Jasiukajtis 
231*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
232*25c28e83SPiotr Jasiukajtis 		"movl %1,%%ecx\n\t"
233*25c28e83SPiotr Jasiukajtis 		"negl %%ecx\n\t"			/* ecx <-- -lo_32(x) */
234*25c28e83SPiotr Jasiukajtis 		"orl  %%ecx,%1\n\t"
235*25c28e83SPiotr Jasiukajtis 		"shrl $31,%1\n\t"			/* 1 iff lx != 0 */
236*25c28e83SPiotr Jasiukajtis 		"andl $0x7fffffff,%2\n\t"	/* ecx <-- hi_32(abs(x)) */
237*25c28e83SPiotr Jasiukajtis 		"orl  %2,%1\n\t"
238*25c28e83SPiotr Jasiukajtis 		"subl $0x7ff00000,%1\n\t"
239*25c28e83SPiotr Jasiukajtis 		"negl %1\n\t"
240*25c28e83SPiotr Jasiukajtis 		"shrl $31,%1\n\t"
241*25c28e83SPiotr Jasiukajtis 		: "=r" (ret)
242*25c28e83SPiotr Jasiukajtis 		: "0" (_HI_WORD(d)), "r" (_LO_WORD(d))
243*25c28e83SPiotr Jasiukajtis 		: "ecx");
244*25c28e83SPiotr Jasiukajtis 
245*25c28e83SPiotr Jasiukajtis 	return (ret);
246*25c28e83SPiotr Jasiukajtis }
247*25c28e83SPiotr Jasiukajtis 
248*25c28e83SPiotr Jasiukajtis extern __inline__ int
249*25c28e83SPiotr Jasiukajtis isnanf(float f)
250*25c28e83SPiotr Jasiukajtis {
251*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
252*25c28e83SPiotr Jasiukajtis 	    "andl $0x7fffffff,%0\n\t"
253*25c28e83SPiotr Jasiukajtis 	    "negl %0\n\t"
254*25c28e83SPiotr Jasiukajtis 	    "addl $0x7f800000,%0\n\t"
255*25c28e83SPiotr Jasiukajtis 	    "shrl $31,%0\n\t"
256*25c28e83SPiotr Jasiukajtis 	    : "+r" (f)
257*25c28e83SPiotr Jasiukajtis 	    :
258*25c28e83SPiotr Jasiukajtis 	    : "cc");
259*25c28e83SPiotr Jasiukajtis 
260*25c28e83SPiotr Jasiukajtis 	return (f);
261*25c28e83SPiotr Jasiukajtis }
262*25c28e83SPiotr Jasiukajtis 
263*25c28e83SPiotr Jasiukajtis extern __inline__ double
264*25c28e83SPiotr Jasiukajtis rint(double a) {
265*25c28e83SPiotr Jasiukajtis     return (__inline_rint(a));
266*25c28e83SPiotr Jasiukajtis }
267*25c28e83SPiotr Jasiukajtis 
268*25c28e83SPiotr Jasiukajtis extern __inline__ double
269*25c28e83SPiotr Jasiukajtis scalbn(double d, int n)
270*25c28e83SPiotr Jasiukajtis {
271*25c28e83SPiotr Jasiukajtis 	double dummy;
272*25c28e83SPiotr Jasiukajtis 
273*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
274*25c28e83SPiotr Jasiukajtis 	    "fildl %2\n\t"	/* Convert N to extended */
275*25c28e83SPiotr Jasiukajtis 	    "fxch\n\t"
276*25c28e83SPiotr Jasiukajtis 	    "fscale\n\t"
277*25c28e83SPiotr Jasiukajtis 	    : "+t" (d), "=u" (dummy)
278*25c28e83SPiotr Jasiukajtis 	    : "m" (n)
279*25c28e83SPiotr Jasiukajtis 	    : "cc");
280*25c28e83SPiotr Jasiukajtis 
281*25c28e83SPiotr Jasiukajtis 	return (d);
282*25c28e83SPiotr Jasiukajtis }
283*25c28e83SPiotr Jasiukajtis 
284*25c28e83SPiotr Jasiukajtis extern __inline__ int
285*25c28e83SPiotr Jasiukajtis signbit(double d)
286*25c28e83SPiotr Jasiukajtis {
287*25c28e83SPiotr Jasiukajtis 	return (_HI_WORD(d) >> 31);
288*25c28e83SPiotr Jasiukajtis }
289*25c28e83SPiotr Jasiukajtis 
290*25c28e83SPiotr Jasiukajtis extern __inline__ int
291*25c28e83SPiotr Jasiukajtis signbitf(float f)
292*25c28e83SPiotr Jasiukajtis {
293*25c28e83SPiotr Jasiukajtis 	return ((*(uint32_t *)&f) >> 31);
294*25c28e83SPiotr Jasiukajtis }
295*25c28e83SPiotr Jasiukajtis 
296*25c28e83SPiotr Jasiukajtis extern __inline__ double
297*25c28e83SPiotr Jasiukajtis sqrt(double d)
298*25c28e83SPiotr Jasiukajtis {
299*25c28e83SPiotr Jasiukajtis 	return (__inline_sqrt(d));
300*25c28e83SPiotr Jasiukajtis }
301*25c28e83SPiotr Jasiukajtis 
302*25c28e83SPiotr Jasiukajtis extern __inline__ float
303*25c28e83SPiotr Jasiukajtis sqrtf(float f)
304*25c28e83SPiotr Jasiukajtis {
305*25c28e83SPiotr Jasiukajtis 	return (__inline_sqrtf(f));
306*25c28e83SPiotr Jasiukajtis }
307*25c28e83SPiotr Jasiukajtis 
308*25c28e83SPiotr Jasiukajtis extern __inline__ long double
309*25c28e83SPiotr Jasiukajtis sqrtl(long double ld)
310*25c28e83SPiotr Jasiukajtis {
311*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__("fsqrt" : "+t" (ld) : : "cc");
312*25c28e83SPiotr Jasiukajtis 	return (ld);
313*25c28e83SPiotr Jasiukajtis }
314*25c28e83SPiotr Jasiukajtis 
315*25c28e83SPiotr Jasiukajtis extern __inline__ int
316*25c28e83SPiotr Jasiukajtis isnanl(long double ld)
317*25c28e83SPiotr Jasiukajtis {
318*25c28e83SPiotr Jasiukajtis 	int ret = _HIER_WORD(ld);
319*25c28e83SPiotr Jasiukajtis 
320*25c28e83SPiotr Jasiukajtis 	__asm__ __volatile__(
321*25c28e83SPiotr Jasiukajtis 	    "andl  $0x00007fff,%0\n\t"
322*25c28e83SPiotr Jasiukajtis 	    "jz	   1f\n\t"		/* jump if exp is all 0 */
323*25c28e83SPiotr Jasiukajtis 	    "xorl  $0x00007fff,%0\n\t"
324*25c28e83SPiotr Jasiukajtis 	    "jz	   2f\n\t"		/* jump if exp is all 1 */
325*25c28e83SPiotr Jasiukajtis 	    "testl $0x80000000,%1\n\t"
326*25c28e83SPiotr Jasiukajtis 	    "jz	   3f\n\t"		/* jump if leading bit is 0 */
327*25c28e83SPiotr Jasiukajtis 	    "xorl  %0,%0\n\t"
328*25c28e83SPiotr Jasiukajtis 	    "jmp   1f\n\t"
329*25c28e83SPiotr Jasiukajtis 	    "2:\n\t"			/* note that %0 = 0 from before */
330*25c28e83SPiotr Jasiukajtis 	    "cmpl  $0x80000000,%1\n\t"	/* what is first half of significand? */
331*25c28e83SPiotr Jasiukajtis 	    "jnz   3f\n\t"		/* jump if not equal to 0x80000000 */
332*25c28e83SPiotr Jasiukajtis 	    "testl $0xffffffff,%2\n\t"	/* is second half of significand 0? */
333*25c28e83SPiotr Jasiukajtis 	    "jnz   3f\n\t"		/* jump if not equal to 0 */
334*25c28e83SPiotr Jasiukajtis 	    "jmp   1f\n\t"
335*25c28e83SPiotr Jasiukajtis 	    "3:\n\t"
336*25c28e83SPiotr Jasiukajtis 	    "movl  $1,%0\n\t"
337*25c28e83SPiotr Jasiukajtis 	    "1:\n\t"
338*25c28e83SPiotr Jasiukajtis 	    : "+&r" (ret)
339*25c28e83SPiotr Jasiukajtis 	    : "r" (_HI_WORD(ld)), "r" (_LO_WORD(ld))
340*25c28e83SPiotr Jasiukajtis 	    : "cc");
341*25c28e83SPiotr Jasiukajtis 
342*25c28e83SPiotr Jasiukajtis 	return (ret);
343*25c28e83SPiotr Jasiukajtis }
344*25c28e83SPiotr Jasiukajtis 
345*25c28e83SPiotr Jasiukajtis #ifdef __cplusplus
346*25c28e83SPiotr Jasiukajtis }
347*25c28e83SPiotr Jasiukajtis #endif
348*25c28e83SPiotr Jasiukajtis 
349*25c28e83SPiotr Jasiukajtis #endif  /* __GNUC__ */
350*25c28e83SPiotr Jasiukajtis 
351*25c28e83SPiotr Jasiukajtis #endif /* _LIBM_INLINES_H */
352