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