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