xref: /csrg-svn/lib/libc/i386/gen/modf.s (revision 45821)
141044Swilliam/*-
241044Swilliam * Copyright (c) 1990 The Regents of the University of California.
341044Swilliam * All rights reserved.
441044Swilliam *
541044Swilliam * This code is derived from software contributed to Berkeley by
641044Swilliam * Sean Eric Fagan
741044Swilliam *
841044Swilliam * %sccs.include.redist.c%
941044Swilliam */
1041044Swilliam
1141044Swilliam#if defined(LIBC_SCCS) && !defined(lint)
12*45821Swilliam.asciz  "@(#)modf.c	5.1 (Berkeley) 4/23/90"
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. */
24*45821Swilliam.text
25*45821Swilliam.globl _modf
26*45821Swilliam_modf:
27*45821Swilliam	pushl %ebp
28*45821Swilliam	movl %esp,%ebp
29*45821Swilliam	subl $16,%esp
30*45821Swilliam/APP
31*45821Swilliam	fnstcw -12(%ebp)
32*45821Swilliam/NO_APP
33*45821Swilliam	movw -12(%ebp),%dx
34*45821Swilliam	orw $3072,%dx
35*45821Swilliam	movw %dx,-16(%ebp)
36*45821Swilliam/APP
37*45821Swilliam	fldcw -16(%ebp)
38*45821Swilliam/NO_APP
39*45821Swilliam	fldl 8(%ebp)
40*45821Swilliam/APP
41*45821Swilliam	frndint
42*45821Swilliam/NO_APP
43*45821Swilliam	fstpl -8(%ebp)
44*45821Swilliam/APP
45*45821Swilliam	fldcw -12(%ebp)
46*45821Swilliam/NO_APP
47*45821Swilliam	movl 16(%ebp),%eax
48*45821Swilliam	movl -8(%ebp),%edx
49*45821Swilliam	movl -4(%ebp),%ecx
50*45821Swilliam	movl %edx,(%eax)
51*45821Swilliam	movl %ecx,4(%eax)
52*45821Swilliam	fldl 8(%ebp)
53*45821Swilliam	fsubl -8(%ebp)
54*45821Swilliam	jmp L1
55*45821SwilliamL1:
56*45821Swilliam	leave
57*45821Swilliam	ret
58