xref: /csrg-svn/lib/libc/tahoe/gen/modf.s (revision 29696)
1#ifdef LIBC_SCCS
2	.asciz	"@(#)modf.s	1.1 (Berkeley) 08/01/86"
3#endif LIBC_SCCS
4
5/*
6 * double modf (value, iptr)
7 * double value, *iptr;
8 *
9 * Modf returns the fractional part of "value",
10 * and stores the integer part indirectly through "iptr".
11 *
12 * This version uses floating point (look in ../fpe for
13 * a much slower integer version).
14 */
15
16#include "DEFS.h"
17
18ENTRY(modf, 0)
19	movl	12(fp),r3
20	ldd	4(fp)
21	tstd		# if (value < 0)
22	jgeq	1f
23	negd
24	cvdl	r2	# ul = -value
25	bvs	2f
26	mnegl	r2,r0
27	cvld	r0
28	std	(r3)	# *iptr = -ul
29	cvld	r2
30	addd	4(fp)
31	std	r0	# return (value + ul)
32	ret
331:
34	cvdl	r2	# ul = value
35	bvs	2f
36	cvld	r2
37	std	(r3)	# *iptr = ul
38	std	r0
39	ldd	4(fp)
40	subd	r0
41	std	r0
42	ret
432:			# integer overflow
44	movl	4(fp),(r3)
45	movl	8(fp),4(r3)
46	clrl	r0
47	clrl	r1
48	ret
49