xref: /csrg-svn/lib/libc/i386/gen/ldexp.c (revision 41043)
1*41043Swilliam /*-
2*41043Swilliam  * Copyright (c) 1990 The Regents of the University of California.
3*41043Swilliam  * All rights reserved.
4*41043Swilliam  *
5*41043Swilliam  * This code is derived from software contributed to Berkeley by
6*41043Swilliam  * Sean Eric Fagan.
7*41043Swilliam  *
8*41043Swilliam  * %sccs.include.redist.c%
9*41043Swilliam  */
10*41043Swilliam 
11*41043Swilliam #if defined(LIBC_SCCS) && !defined(lint)
12*41043Swilliam static char sccsid[] = "@(#)ldexp.c	5.1 (Berkeley) 04/23/90";
13*41043Swilliam #endif /* LIBC_SCCS and not lint */
14*41043Swilliam 
15*41043Swilliam /*
16*41043Swilliam  * ldexp(value, exp): return value * (2 ** exp).
17*41043Swilliam  *
18*41043Swilliam  * Written by Sean Eric Fagan (sef@kithrup.COM)
19*41043Swilliam  * Sun Mar 11 20:27:09 PST 1990
20*41043Swilliam  */
21*41043Swilliam 
22*41043Swilliam /*
23*41043Swilliam  * We do the conversion in C to let gcc optimize it away, if possible.
24*41043Swilliam  * The "fxch ; fstp" stuff is because value is still on the stack
25*41043Swilliam  * (stupid 8087!).
26*41043Swilliam  */
27*41043Swilliam double
28*41043Swilliam ldexp (double value, int exp)
29*41043Swilliam {
30*41043Swilliam 	double temp, texp, temp2;
31*41043Swilliam 	texp = exp;
32*41043Swilliam 	asm ("fscale ; fxch %%st(1) ; fstp%L1 %1 "
33*41043Swilliam 		: "=f" (temp), "=0" (temp2)
34*41043Swilliam 		: "0" (texp), "f" (value));
35*41043Swilliam 	return (temp);
36*41043Swilliam }
37