1*41044Swilliam/*- 2*41044Swilliam * Copyright (c) 1990 The Regents of the University of California. 3*41044Swilliam * All rights reserved. 4*41044Swilliam * 5*41044Swilliam * This code is derived from software contributed to Berkeley by 6*41044Swilliam * Sean Eric Fagan 7*41044Swilliam * 8*41044Swilliam * %sccs.include.redist.c% 9*41044Swilliam */ 10*41044Swilliam 11*41044Swilliam#if defined(LIBC_SCCS) && !defined(lint) 12*41044Swilliamstatic char sccsid[] = "@(#)modf.s 5.1 (Berkeley) 04/23/90"; 13*41044Swilliam#endif /* LIBC_SCCS and not lint */ 14*41044Swilliam 15*41044Swilliam/* 16*41044Swilliam * modf(value, iptr): return fractional part of value, and stores the 17*41044Swilliam * integral part into iptr (a pointer to double). 18*41044Swilliam * 19*41044Swilliam * Written by Sean Eric Fagan (sef@kithrup.COM) 20*41044Swilliam * Sun Mar 11 20:27:30 PST 1990 21*41044Swilliam */ 22*41044Swilliam 23*41044Swilliam/* With CHOP mode on, frndint behaves as TRUNC does. Useful. */ 24*41044Swilliamdouble 25*41044Swilliammodf(double value, double *iptr) 26*41044Swilliam{ 27*41044Swilliam double temp; 28*41044Swilliam short i87flag, i87temp; 29*41044Swilliam __asm ("fnstcw %0" : "=g" (i87flag) : ); 30*41044Swilliam i87temp = i87flag | 0xc00 ; /* turn on chop mode [truncation] */ 31*41044Swilliam __asm ("fldcw %0" : : "g" (i87temp)); 32*41044Swilliam __asm ("frndint" : "=f" (temp) : "0" (value)); /* temp = int of value */ 33*41044Swilliam __asm ("fldcw %0" : : "g" (i87flag)); 34*41044Swilliam *iptr = temp; 35*41044Swilliam return (value - temp); 36*41044Swilliam} 37