141043Swilliam /*- 2*61221Sbostic * Copyright (c) 1990, 1993 3*61221Sbostic * The Regents of the University of California. All rights reserved. 441043Swilliam * 541043Swilliam * This code is derived from software contributed to Berkeley by 641043Swilliam * Sean Eric Fagan. 741043Swilliam * 841043Swilliam * %sccs.include.redist.c% 941043Swilliam */ 1041043Swilliam 1141043Swilliam #if defined(LIBC_SCCS) && !defined(lint) 12*61221Sbostic static char sccsid[] = "@(#)ldexp.c 8.1 (Berkeley) 06/04/93"; 1341043Swilliam #endif /* LIBC_SCCS and not lint */ 1441043Swilliam 1541043Swilliam /* 1641043Swilliam * ldexp(value, exp): return value * (2 ** exp). 1741043Swilliam * 1841043Swilliam * Written by Sean Eric Fagan (sef@kithrup.COM) 1941043Swilliam * Sun Mar 11 20:27:09 PST 1990 2041043Swilliam */ 2141043Swilliam 2241043Swilliam /* 2341043Swilliam * We do the conversion in C to let gcc optimize it away, if possible. 2441043Swilliam * The "fxch ; fstp" stuff is because value is still on the stack 2541043Swilliam * (stupid 8087!). 2641043Swilliam */ 2741043Swilliam double ldexp(double value,int exp)2841043Swilliamldexp (double value, int exp) 2941043Swilliam { 3041043Swilliam double temp, texp, temp2; 3141043Swilliam texp = exp; 3241043Swilliam asm ("fscale ; fxch %%st(1) ; fstp%L1 %1 " 3341043Swilliam : "=f" (temp), "=0" (temp2) 3441043Swilliam : "0" (texp), "f" (value)); 3541043Swilliam return (temp); 3641043Swilliam } 37