xref: /csrg-svn/lib/libc/i386/gen/modf.s (revision 41044)
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