xref: /csrg-svn/lib/libc/i386/gen/modf.s (revision 61128)
141044Swilliam/*-
2*61128Sbostic * Copyright (c) 1990, 1993
3*61128Sbostic *	The Regents of the University of California.  All rights reserved.
441044Swilliam *
541044Swilliam * This code is derived from software contributed to Berkeley by
647564Sbostic * Sean Eric Fagan.
741044Swilliam *
841044Swilliam * %sccs.include.redist.c%
941044Swilliam */
1041044Swilliam
1141044Swilliam#if defined(LIBC_SCCS) && !defined(lint)
12*61128Sbostic	.asciz "@(#)modf.s	8.1 (Berkeley) 06/04/93"
1341044Swilliam#endif /* LIBC_SCCS and not lint */
1441044Swilliam
1541044Swilliam/*
1641044Swilliam * modf(value, iptr): return fractional part of value, and stores the
1741044Swilliam * integral part into iptr (a pointer to double).
1841044Swilliam *
1941044Swilliam * Written by Sean Eric Fagan (sef@kithrup.COM)
2041044Swilliam * Sun Mar 11 20:27:30 PST 1990
2141044Swilliam */
2241044Swilliam
2341044Swilliam/* With CHOP mode on, frndint behaves as TRUNC does.  Useful. */
2445821Swilliam.text
2545821Swilliam.globl _modf
2645821Swilliam_modf:
2745821Swilliam	pushl %ebp
2845821Swilliam	movl %esp,%ebp
2945821Swilliam	subl $16,%esp
3045821Swilliam	fnstcw -12(%ebp)
3145821Swilliam	movw -12(%ebp),%dx
3245821Swilliam	orw $3072,%dx
3345821Swilliam	movw %dx,-16(%ebp)
3445821Swilliam	fldcw -16(%ebp)
3545821Swilliam	fldl 8(%ebp)
3645821Swilliam	frndint
3745821Swilliam	fstpl -8(%ebp)
3845821Swilliam	fldcw -12(%ebp)
3945821Swilliam	movl 16(%ebp),%eax
4045821Swilliam	movl -8(%ebp),%edx
4145821Swilliam	movl -4(%ebp),%ecx
4245821Swilliam	movl %edx,(%eax)
4345821Swilliam	movl %ecx,4(%eax)
4445821Swilliam	fldl 8(%ebp)
4545821Swilliam	fsubl -8(%ebp)
4645821Swilliam	jmp L1
4745821SwilliamL1:
4845821Swilliam	leave
4945821Swilliam	ret
50